过滤器 Filter

过滤器

  • 作用: 对服务器接收的请求和响应给服务器的资源进行管理

  • 生命周期: 服务器开启到服务器关闭

  • 过滤器是链式操作的

  • 根据规范建议的各种类型的过滤器:

    身份验证过滤器(Authentication Filters)。
    数据压缩过滤器(Data compression Filters)。
    加密过滤器(Encryption Filters)。
    触发资源访问事件过滤器。
    图像转换过滤器(Image Conversion Filters)。
    日志记录和审核过滤器(Logging and Auditing Filters)。
    MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
    标记化过滤器(Tokenizing Filters)。
    XSL/T 过滤器(XSL/T Filters),转换 XML 内容。

使用

  • javax.servlet.Filter类方法
    • init(FilterConfig filterConfig): 初始化方法,只会在加载一次,里面可调用传入的filterConfig参数获取初始化参数。
    • destroy(): 过滤器销毁时的回调方法
    • doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) : 实际的过滤方法,filterChain参数用于访问后续过滤器,调用filterChain.doFilter(servletRequest, servletResponse)后还会执行之后的代码,注意!;
  • 简单的使用
  • web.xml
<!-- 过滤器-->
    <filter>
        <filter-name>testFilter</filter-name>
        <filter-class>cn.lzm.servlet.TestFilter</filter-class>
      <init-param>
        <param-name>name</param-name>
        <param-value>test</param-value>
      </init-param>
    </filter>
    <filter-mapping>
        <filter-name>testFilter</filter-name>
        <url-pattern>*.html</url-pattern> 
    </filter-mapping>
  • java代码
public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init filter"); //初始化过滤器
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames(); //获取init-param 配置的键名
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("html..."); //这个会执行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("html...end"); //这个也会执行
    }
    @Override
    public void destroy() {
        System.out.println("destroy filter"); //过滤器被销毁了
    }
}

关于路径的配置

  • 1.过滤所有资源
    <filter>
        <filter-name>testFilter</filter-name>
        <filter-class>cn.lzm.servlet.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>testFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    1. 过滤指定文件类型,如.html,.jsp,用 *.html 没有 /
  <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>cn.lzm.servlet.TestFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>*.html</url-pattern>
  </filter-mapping>
  • 3.过滤指定路径下,如/test下,就 /test/*
  <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>cn.lzm.servlet.TestFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/test/*</url-pattern>
  </filter-mapping>
    1. 过滤指定的servlet,用servlet-name 代替 url-pattern
  <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>cn.lzm.servlet.TestFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <servlet-name>homeServlet</servlet-name>
  </filter-mapping>
    1. 过滤指定文件,如/test/a.html
  <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>cn.lzm.servlet.TestFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/test/a.html</url-pattern>
  </filter-mapping>
posted @ 2021-02-09 15:02  阿肆啊  阅读(50)  评论(0编辑  收藏  举报