【 Filter简介】
Filter技术在server2.3规范中加入的,大部分的jsp/servlet容器都支持。和AOP一样都体现了面向切面编程的思想,Filter可以看做是一种横切性的技术,同时体现了一种责任链模式(执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意这种责任链的执行顺序问题)和模板方法模式。Filter其实提供了一种声明式服务,具有可插拔的能力。
【Filter功能】
Filter最重要的就是filter功能。它使用户可以改变一个request和修改一个response。Filter其实对Request和Response请求进行了拦截,只对Post请求起作用。tomcat一启动就会new一个Filter。Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。换种说法,filter其实是一个“servletchaining“(servlet 链)。
包括
1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servlet request;
3.根据需要修改request头和request数据;
4.根据需要修改response头和response数据;
5. 在servlet被调用之后截获.
你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用。几个实用的filter包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等。
一个filter必须实现javax.servlet.Filter。
【Fliter接口方法】
1.//在Web容器卸载 Filter对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
Public void public void destroy()
2.//初始化filter
public void init(FilterConfig filterConfig)
3.//执行filter 的工作.调用doFilter方法多次以处理不同的请求
void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及response的操作(包括收集数据,包装数据等)。filter调用chain.doFilter()方法把控制权交给下一个filter。一个filter在doFilter()方法中结束,如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下一个filter.
【FilterChain接口】
1.如何实例化
代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中
2.作用
调用过滤器链中的下一个过滤器
【Fliter使用】
下面是一段简单的日志filter用来记录所有request的持续时间.
创建统一字符集处理的类
/**
* 采用Filter统一处理字符集
* @author Administrator
*
*/
public class CharsetEncodingFilter implements Filter {
private String endcoding;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置字符集
request.setCharacterEncoding(endcoding);
//继续执行
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.endcoding = filterConfig.getInitParameter("encoding");
}
}
Web.xml里面配置filter信息
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.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>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
这样就相当于在每个请求jsp或servlet时单独加入request.setCharacterEncoding("GB18030")这句话的作用。
如果有多个filter,那么只要在web.xml按照所需要的拦截顺序配置filter即可。