Filter过滤器:
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()
方法中,chain.doFilter()
前的一般是对request执行的过滤操作,chain.doFilter
后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:
Filter1:
public class FilterTest01 extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest httpServletReq,
HttpServletResponse httpServletResp, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("...filter1开始了....doFilterInternal...");
filterChain.doFilter(httpServletReq,httpServletResp );
System.out.println("...filter1结束了....doFilterInternal....");
}
}
Filter2:
public class FilterTest02 extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest httpServletReq,
HttpServletResponse httpServletResp, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("...filter2开始了....doFilterInternal...");
filterChain.doFilter(httpServletReq,httpServletResp );
System.out.println("...filter2结束了....doFilterInternal....");
}
}
web.xml
<filter>
<filter-name>filter01</filter-name>
<filter-class>com.edu.dcx.filters.FilterTest01</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter02</filter-name>
<filter-class>com.edu.dcx.filters.FilterTest02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
执行结果:
...filter1开始了....doFilterInternal...
...filter2开始了....doFilterInternal...
...filter2结束了....doFilterInternal....
...filter1结束了....doFilterInternal....
如果调换Filter过滤器的定义顺序,
web.xml
<filter-name>filter02</filter-name>
<filter-class>com.edu.dcx.filters.FilterTest02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter01</filter-name>
<filter-class>com.edu.dcx.filters.FilterTest01</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
运行结果:
...filter2开始了....doFilterInternal...
...filter1开始了....doFilterInternal...
...filter1结束了....doFilterInternal....