简述
过滤器是在客户端与服务器目标资源之间的一道过滤技术过滤器的执行地位在servlet前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时会根据执行流程再次反向执行Filter,可以解决多个servlet共性代码冗余问题,例如乱码处理、登录验证
代码实现
filter是javaweb三大组件之一,如同servlet一样是一个类,自己定义的filter也需要实现一个接口Filter,并重现init、destory、doFilter三个方法,filter类写完后同学需要进行配置,和servlet一样可以在web.xml里进行配置,或者使用注解进行配置
使用web.xml进行配置
和servlet一样,就是将一个URL和类的位置进行一个关联,例如:
<filter> <filter-name>myfilter</filter-name> <filter-class>hjj.web.servlet.test_filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
需要注意url的写法含义:
具体资源路径: /index.jsp | 只有访问index.jsp资源时,过滤器才会被执行 |
拦截目录: /user/* | 访问/user下的所有资源时,过滤器都会被执行 |
后缀名拦截: *.jsp | 访问所有后缀名为jsp资源时,过滤器都会被执行 |
拦截所有资源:/* | 访问所有资源时,过滤器都会被执行 |
我们还可以进行拦截方式的配置,例如我们只拦截浏览器发送的请求,对于服务器内部资源的转发我们就不拦截,对于web.xml我们可以进行<dispatcher></dispatcher>标签进行拦截方式的配置
REQUEST | 默认值。浏览器直接请求资源 |
FORWARD | 转发访问资源 |
INCLUDE | 包含访问资源 |
ERROR | 错误跳转资源 |
ASYNC | 异步访问资源 |
<filter> <filter-name>myfilter</filter-name> <filter-class>hjj.web.servlet.test_filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
基于注解的配置
过滤器注解使用@WebFilter配置
url的配置使用 filterName = "url" 配置
拦截的方式用 dispatcherTypes = DispatcherType.类型 配置
@WebFilter(filterName = "MyFilter",dispatcherTypes = DispatcherType.REQUEST)
值得注意的是拦截方式我们可以配置多个
Filter的生命周期
当服务器启动时会创建filter对象,然后调用init方法,init方法只会执行一次。
每当客户端访问合适的被拦截的路径时,filter会执行doFilter方法。
当服务器关闭时,会调用filter的destory方法
配置多个过滤器
过滤器可以进行嵌套,可以对对过滤器的请求进行拦截
注意当目标资源响应的时候时从后往前传的
当多个过滤器拦截的url都适用的时候,过滤器的执行顺序是怎么样的呢?
用注解配置 | 按照类名的字符串字典序比较规则比较,值小的先执行 |
web.xml配置 | 按照各自的<filter-mapping>定义顺序执行 |