Filter 过滤器

54 阅读1分钟

作用

Filter 是介于客户端(如浏览器)和目标资源(如 Servlet、JSP、静态文件)之间的一道“过滤网”或“安检门”。 它的核心作用是:在请求到达目标资源之前进行检查和预处理,以及在响应返回给客户端之前进行后处理和加工。

生命周期

观察代码

public interface Filter {
    default public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException;

    default public void destroy() {
    }
}

Filter内只有三个函数,初始化,执行,销毁。

过滤器随着web服务器的启动初始化,随服务器关闭而销毁 image.png

举例设置编码过滤器(结合HttpServlet(1))

  1. 依赖Filter
  2. 重写doFilter()方法
  3. 注意不要忘记写chain.doFilter(request, response); 它的作用是将请求和响应传递给过滤器链中的下一个组件,如果不调用这样会导致请求被拦截,无法到达目标 Servlet,客户端会一直等待响应。
public class SetCharacterEncoding implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
        response.setContentType("text/html;charset=UTF-8");
    }

}
    • 可以选择在web.xml中配置filter,代码规范filter要写在servlet上面
      <filter>
        <filter-name>SetCharacterEncoding</filter-name>
        <filter-class>com.xiaozhang.com.SetCharacterEncoding</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>SetCharacterEncoding</filter-name>
        <url-pattern>/hello</url-pattern>
      </filter-mapping>
      
    • 也可以选择使用注解
      @WebFilter("/hello")
      public class SetCharacterEncoding implements Filter {
          ······
      }
      
  1. @WebFilter("") ""中间是指定目录,如果写成/*,就代表所有页面都用此过滤器,如果写成hello/*,就代表hello目录下的页面用测过滤器