目录
- Filter简介及入门
- Filter的API详解
- Filter配置的详解
1 Filter简介及入门
1.1 Fileter简介
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理.
filter工作原理图解:
1.2 入门案例
1.2.1 编写一个Servlet
1.2.2 编写第一个Filter
1.2.3 编写第二个Filter
1.2.4 配置Filter
1.2.5 访问Servlet
1.2.6 结论
如果Filter的<url-pattern>配置为过滤servlet路径,那么在请求到达该servlet之前,会先经过过滤器.执行过滤器的前处理(doFilter()方法).直到过滤器执行放行操作:
chain.doFilter(request,response),再进入下一个Filter,所有的Filter放行完成后,请求到达servlet;在servlet处理完成之后,请求会再次返回,即经过Filter的后处理.
在整个前处理过程中,如果过滤器链中的某一个过滤器不进行放行操作,则该请求无法到达目标资源.目标资源就包括所有Servlet,jsp等动态资源和js,css,html等静态资源.
2 Filter的API详解
2.1 Filter生命周期及其相关方法
2.1.1 Filter的生命周期
Filter何时创建:服务器启动时就创建filter对象
Filter何时销毁:服务器关闭时filter销毁
2.1.2 生命周期方法
Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法
- init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行
- doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
- destory():代表是filter销毁方法 当filter对象销毁时执行该方法
2.2 API详解
2.2.1 init方法
其中参数config代表该Filter对象的配置信息的对象,内部封装是该filter的配置信息。
- 代码演示
在web.xml中分别配置filter的初始化参数和web应用的初始化参数.
重写Filter的init()方法:
启动服务器,结果如下:
2.2.2 destroy方法
该方法会在服务器关闭的时候,及Filter对象被销毁的时候调用.见入门案例
2.2.3 doFilter方法
doFilter(ServletRequest,ServletResponse,FilterChain)
其中的参数:
- ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。
- FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求
3 Filter配置详解
3.1 基本配置图解
Filter的基本配置如下:
3.2 过滤规则详解
3.2.1 url-pattern
配置的核心部分在于,也就是过滤资源的路径.配置该标签时有以下几种配置方式:
- 完全匹配: /demo1
- 目录匹配: /aaa/bbb/*
- 扩展名匹配: *.action *.jsp…
- 代码演示
创建两个Filter,其过滤规则为第二,第三种.再创建两个Servlet,访问路径分别第二,第三种.测试的配置.
- 第二种过滤规则的测试
Filter的配置及代码
Servlet的配置及代码
2) 第三种过滤规则的测试
Filter的配置及代码
Servlet的配置及代码
- 测试结果
3.2.2 servlet-name
过滤器的过滤规则除了可以使用url-pattern进行配置以外,还可以使用servlet-name进行配置.
- 代码演示
写一个过滤器,通过servlet-name过滤Demo1Servlet.
- 测试结果
3.2.3 dispatcher
dispatcher代表请求的访问方式.
- REQUEST:默认值,代表直接访问某个资源时执行filter
- FORWARD:转发时才执行filter
- INCLUDE: 包含资源时执行filter
- ERROR:发生错误时 进行跳转是执行filter
- 代码演示
在index.jsp页面中,进行请求转发,转发到Demo1Servlet
按照之前的案例,在我访问/demo1的时候,请求会经过3个过滤器.但是查看控制台:
发现只对jsp页面进行了过滤.原因就是因为我们过滤请求的方式是直接访问,请求转发的时候不包含在内.所以需要在Filter的配置中,配置dispatcher标签.
我们对Demo6Filter的配置进行修改:
再次访问index.jsp: