1. Filter过滤器概述
Filter是Servlet中的一个高级特性,通俗的来说,它可以在servlet之外对request或者是response进行修改。Filter有一个FilterChain概念,就是一个FilterChain中包含多个Filter,也就是过滤链。
客户端请求request在抵达Servlet之前会经过FilterChain中所有的Filter,服务器端响应response在抵达客户端浏览器之前,也会进过FilterChain里所有的Filter。
2. Filter使用
如果要在我们的Java Web项目中使用Filter,首先要一个类实现一个Filter接口,这个Filter接口有3个方法,分别是init(),doFilter(),destory(),这三个方法也说明了Filter的生命周期。init方法和destory方法只会被调用一次,分别在Web程序加载或卸载的时候调用。doFilter方法则是每次客户端请求的时候都会被调用,具体一个简单的实例如下:
public class MyFilter implements Filter {
//Filter注销方法,一般用来释放一些资源
@Override
public void destroy() {}
//filter要实现的功能
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("接收到request请求");
//继续向下执行,如果还有其他filter继续调用其他filter,没有的话将消息发送给服务器(Servlet)
chain.doFilter(request, response);
System.out.println("request被处理之后,response抵达客户端浏览器之前");
}
//初始化方法,一般用来加载一些资源
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
}
定义完一个Filter之后,如果我们要在项目中真正的使用,还需要在web.xml中配置这个Filter,具体的配置方法如下:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.tgb.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.do</url-pattern>
<!-- 这里可配置多个url-pattern,是或的关系 -->
<!-- 还可以配置<dispatcher>,具体用法参照此文章:http://hintcnuie.iteye.com/blog/226251/ -->
</filter-mapping>
Filter的执行是有先后顺序的,规则就是<filter-mapping>配置在前面的Filter执行要早于配置在后面的Filter,这个顺序也是十分重要的,比如说一个拦截异常的Filter,需要配置在会抛出异常的Filter之前,这样才能捕获到异常信息,具体的Filter的一些应用,我会在接下来的博客中慢慢介绍,持续更新。
这篇文章介绍的比较详细,可参考: