首页 > 代码库 > servlet之filter

servlet之filter

过滤器:如图所示,可以对请求和响应资源进行拦截过滤,一般用于改变请求(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方法作用是表示该过滤器已经完成了工作,现在将资源交给下一个过滤器,这也从而组成了所谓的过滤器链!