1.Filter过滤器
Filter过滤器是javaEE的规范,是接口(javax.servlet Interface Filter)
2.过滤器作用-
拦截请求,过滤响应
情景引入:浏览器访问tomcat的login页面,进行登录验证,保存session,之后再对具体的资源进行访问
if 浏览器不讲武德,直接去访问资源,怎么办?在资源上获取session进行验证用户是否登录,如果资源有很多,那么每个都要进行验证---代码冗余,管理复杂,怎么办?
使用过滤器统一验证(身份验证,权限检查,日志操作,事务管理)
3.过滤器原理
浏览器---http请求
↓
服务器(tomcat)<在web.xml文件中由程序员进行过滤条件的设置,符合条件的进行过滤,不符合的直接放行>
<!--filter一般写在servlet前面-->
<!--<url-pattern>/manage/*</url-pattern>
表示当你去访问这个路径下的资源时候,就会调用这个Filter进行过滤
/manage/*中第一个/会由服务器来解析,解析成http://localhost:8080(ip:port)/工程路径-->
<filter>
<filter-name>ManageFilter</filter-name>
<filter-class>com.zitWang.filter.ManageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ManageFilter</filter-name>
<url-pattern>/manager/*</url-pattern>
</filter-mapping>
↓
filter过滤器 →<失败就返回>
↓<合法就允许访问资源>
资源
4.Filter配置Url-Pattern规则
url-pattern设置Filter的拦截路径,拦截时,只关心是否匹配,不关心请求的资源是否真的存在
匹配:
5.Filter生命周期
5.1创建:web工程启动,执行构造器与init方法,生成一个ManagerFilter实例常驻内存(一个filter,一次init()方法发的调用)
5.2活动:http请求到了tomcat服务器时,<url-pattern>匹配上了,执行doFilter();进行拦截
浏览器的地址栏:http://localhost:8080/工程路径/manager/xxxx资源
与<url-pattern>/manager/*</url-pattern>匹配上了
调用时候tomcat创建(ServletRequest,ServletResponse ,FilterChain三个对象),并且通过doFilter传入,在同一次请求中,ServletRequest,ServletResponse分别与之后使用的Request,Response是同一个对象。
5.3销毁:停止web工程时,调用destroy();销毁Filter实例
6.FilterConfig
filterConfig在创建filter时一并创建,通过init()方法传入,filterConfig包含filter的配置文件的配置信息
7.FilterChain过滤器链
一次请求,一个线程中,多个过滤器层层把关,筛选拦截
filterChain.doFilter(servletRequest,servletResponse);
在一个过滤器的doFilter方法中执行filterChain.doFilter(servletRequest,servletResponse);表示执行下一个过滤器的doFilter方法,如果没有下一个过滤器,则表示这个过滤器放行,此时会访问目标资源。
FilterChain过滤器链:一次http请求的多层过滤
一个过滤器的doFilter方法中有:(前置代码)+(filterChain.doFilter)+(后置代码)
当有多个过滤器执行过滤器链的时候:请求顺序按照web.xml文件中filter的配置顺序执行,具体执行顺序如下:
例子:a过滤器:(前置代码AAA)+(a的filterChain.doFilter)+(后置代码aaa)
b过滤器:(前置代码BBB)+(b的filterChain.doFilter)+(后置代码bbb)
顺序:AAA →a的filterChain.doFilter →前置代码BBB →b的filterChain.doFilter →请求到了目标资源→执行后置代码bbb → 执行后置代码aaa