Filter 是javaweb 三大组件之一,本身是一个接口。
作用: 拦截访问服务器资源的请求,加强request与response
配置方式
-
注解配置
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD}) public class FilterDemo1 implements Filter {
-
web.xml 文件配置
<filter> <filter-name>filterDemo1</filtername> <filterclass>com.liuyisheng.LoginTest.Filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>filterDemo1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
生命周期
- init:服务器启动后,创建filter对象时,调用init方法,只执行一次,多为初始化资源。
- doFilter: 每次请求被拦截时调用,多次请求多次调用,类似servlet中的service方法。
- destroy:每次服务器关闭时(正常关闭)调用destroy 方法,销毁filter,只执行一次。
执行流程
A–>请求–>拦截器–>doFilter方法放行前代码–>chain.doFilter():放行–>资源–>返回响应请求–>doFilter方法放行后代码–>A
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//增强request
System.out.println("filter ....");
//放行
chain.doFilter(req, resp);
//增强response
System.out.println("filter ....");
}
拦截方式
Filter dispatcherTypes 属性 可以设置拦截方式,一共5种:
- DispatcherType.REQUEST: 作用于直接请求,客户端访问服务器 也是默认属性
- DispatcherType.FORWARD:作用于重定向,服务器内转发请求资源
- DispatcherType.INCLOUD:包含访问资源
- DispatcherType.ERROR:错误跳转资源时(500,404之类)
- DispatcherType.ASYNC:异步访问资源
注意 dispatcherTypes 是一个数组,可以同时设置多个拦截方式。
拦截路径
urlPatterns 拦截路径设置
urlPatterns = "/demo.jsp"
只过滤demo.jsp 资源urlPatterns = "/dic/*"
dic目录下的资源全部过滤urlPatterns = "*.jsp"
过滤所有jsp资源urlPatterns = "/*"
过滤全部
拦截顺序
- 注解写法的拦截器,根据拦截器名的String顺序,小的先执行
- web.xml 写法,文件上面的拦截器先执行
多个拦截器执行顺序
Filter1执行
Filter2执行
被请求的资源执行
Filter2执行
Filter1执行