Filter 知识总结

Filter对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

1  生命周期:服务器启动执行init 方法,当调用拦截到的时候执行doFilter方法,服务器关闭执行destroy方法。

2  实例

    1)批量设置请求编码

   public class EncodingFilter implements Filter {


    private String encoding = null;

    public void destroy() {
        encoding = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        String encoding = getEncoding();
        if (encoding == null){
            encoding = "gb2312";
        }
        request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.encoding = filterConfig.getInitParameter("encoding");
    }

    private String getEncoding() {
        return this.encoding;
    }

}

Xml代码

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.logcd.filter.EncodingFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>gb2312</param-value>
    </init-param>
</filter>

<filter-mapping>
   <filter-name>EncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>

</filter-mapping>

   2)用filter控制用户访问权限 

public void doFilter(ServletRequest request,

        ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    HttpSession session = req.getSession();
    if (session.getAttribute("username") != null) {//登录后才能访问
        chain.doFilter(request, response);
    } else {
        res.sendRedirect("../failure.jsp");
    }

}

 XML 代码

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>com.logcd.filter.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>

</filter-mapping>

3 Filter 执行顺序 

      当有多个Filter 的时候执行顺序是采用过滤链的方法,一次执行多个Filter的doFilter()方法.按照web.xml中过滤器定义的先后循序组装成一条链。先执行chain.doFilter()前面的方法一次然后从后到前执行chain.doFilter()后面的方法。

    如上执行顺序为:

  • 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
  • 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
  • 如果用户已登录,则访问请求的资源:/admin/index.jsp。
  • 如果用户未登录,则页面重定向到:/failure.jsp。
  • 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
  • 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。

  • 参考资料:http://log-cd.iteye.com/blog/423179
  •  
    原文地址:https://www.cnblogs.com/brucetie/p/3993030.html