• Java过滤器原理方法


    过滤器可以对资源的请求和相应提供过滤功能,配置在web.xml文件中。
    过滤器可用来实现以下功能
    1. 权限过滤
    2. 登陆和检查验证
    3. 图像转换
    4. 数据压缩
    5. 加密
    6. 令牌验证
    7. 触发访问资源的事件
    8. XSL/T过滤
    9. Mime-type chain过滤

    在filter服务被加载到web容器中时首先调用init函数,且仅调用一次,如果init函数调用失败,filter将不能工作。参数FilterConfig对象包含过滤器在web.xml中的配置参数。

    过滤功能在doFilter函数中实现,包含ServletContext参数。doFilter函数在每次请求或响应经过过滤器链的时候被调用,FilterChain.doFilter用于调用下一个过滤器的doFilter方法。

    该函数可实现:
    1. 检查request
    2. 替换请求内容或请求头信息
    3. 替换响应内容或响应头信息

    destroy方法由web容器调用,指示它正在退出服务的过滤器。此方法仅调用一次,即当过滤器的doFilter方法​​中的所有线程都退出后或超时时间已过。
    Web容器调用此方法后,这个过滤器的doFilter方法将不会再被调用​​。
    该方法让过滤器可以清理其占有的资源,如内存,文件和线程,并确保任何持久性状态与内存中的过滤器的当前状态同步。

     

    Example:

    web.xml

     1  <filter>
     2     <filter-name>filter1</filter-name>
     3     <filter-class>com.filter.MyFilter</filter-class>
     4  </filter>
     5  <filter-mapping>
     6     <filter-name>filter1</filter-name>
     7     <url-pattern>/*</url-pattern>
     8  </filter-mapping>
     9     
    10  <filter>
    11     <filter-name>filter2</filter-name>
    12     <filter-class>com.filter.MyFilter</filter-class>
    13  </filter>
    14  <filter-mapping>
    15     <filter-name>filter2</filter-name>
    16     <url-pattern>/*</url-pattern>
    17  </filter-mapping>    

    在web.xml文件中配置两个过滤器filter1和filter2,拦截所有请求

    MyFilter.java

     1 public class FilterOne implements Filter {
     2 
     3     //Filter 链的执行
     4     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
     5             throws IOException, ServletException {
     6         // 对请求进行过滤
     7         System.out.println("filter one before");
     8 
     9         // 下一个过滤器或
    10         arg2.doFilter(arg0, arg1);
    11 
    12         // 对响应的过滤
    13         System.out.println("filter one after");
    14     }
    15 
    16     // 初始化过滤器
    17     public void init(FilterConfig arg0) throws ServletException {
    18         System.out.println("filter one init");
    19     }
    20 
    21     // 释放过滤器使用的资源
    22     public void destroy() {
    23         System.out.println("filter one destroy");
    24     }
    25 
    26 }

    输出:

    filter one before

    filter two before

    filter two after

    filter one after

    觉得不错,点个赞吧
  • 相关阅读:
    Codeforces Round #631 (Div. 2)
    Codeforces Round #500 (Div. 2) [based on EJOI]
    KMP+状态机
    状态机模型
    最短编辑距离
    stringstream读入-最优乘车
    多重背包
    Codeforces:B. New Year and Ascent Sequence
    查找目录下所有文件使用到的宏
    QProcess调用外部程序并带参执行
  • 原文地址:https://www.cnblogs.com/luangeng/p/5624976.html
Copyright © 2020-2023  润新知