过滤器:如图所示,可以对请求和响应资源进行拦截过滤,一般用于改变请求(request)和响应(response)的头信息与内容信息,改变信息的编码方式等等。可以指定按照一定顺 序调用的一个和多个过滤器,这就组成了链(chain)。
实现过滤器非常简单,只需要实现javax.servlet.Filter接口,就可以实现一个过滤器,Web容器负责创建javax.servler.FilterConfig对象,在容器启动时实例化和初始化过滤器在调用init()方法后开始(init是容器自动调用的)。Filter接口定义的方法如下:
- void
init(FilterConfig filterConfig))--在filter被加载到service中的时候被container调用,Servlet
container实例化完filter以后立即调用Filter的init方法并自动传递一个FilterConfig对象进去,init方法中的工作必须在执行过滤过滤任务之前正确的完成。 - void
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)--Filter中的doFilter方法在每次request/response时候会被container调用,能够传递到doFilter中的request或者response可以传递到Filter环中的下一个环节。 此时的Filter在设计模式中被称作责任链模式结构,这里面抽象处理者的角色就是javax.servlet.Filter这个接口,注册的所有Filter是具体的处理者,在doFilter方法中实现具体处理逻辑,在这里面责任链是一条直线,构成这条直线的就是所有注册的Filter。 - destroy--当filter从service中移除的时候,container调用destroy方法,通过调用这个方法,释放Filter所占有的系统资源。
现在看看web.xml的配置片段:
<filter>
<display-name>EcodingFilter</display-name>
<filter-name>EcodingFilter</filter-name>
<filter-class>org.filter.ConfigFilter</filter-class>
<init-param>
<param-name>EncodeCoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ConfigFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping
java片段代码:
public class ConfigFilter implements Filter{
private String parm=null;
private FilterConfig filterconfig= null;//web容器负责创建
public ConfigFilter(){
super();
}
public void destroy() {
System.out.println("Filter destroy.....");}
public void doFilter(ServletRequest res, ServletResponse rep,
FilterChain chain) throws IOException, ServletException {
_encoding=this.filterconfig.getInitParameter("filterParam");
res.setHeader("Pragma","No-cache");
res.setHeader("Cache-Control","no-cache");String _encoding = this.encoding;
if (_encoding != null) {
/**
* 采用设置的字符集
*/
request.setCharacterEncoding(_encoding);
} else {
/**
* 若未设置字符集,默认为utf-8
*/
request.setCharacterEncoding("utf-8");
}chain.doFilter(res, rep);
System.out.println("Filter in work");
}public void init(FilterConfig filter) throws ServletException {
this.filterconfig=filter;//web容器初始化过滤器时自动调用
System.out.println("Initialing the Filter...");
}}
以上代码就是过滤器的一般流程,通过读取init-param参数获得编码方式,然后在每次请求时加以设置。doFilter方法作用是表示该过滤器已经完成了工作,现在将资源交给下一个过滤器,这也从而组成了所谓的过滤器链!