Filter过滤器

Posted 10000miles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器相关的知识,希望对你有一定的参考价值。

  • 什么是过滤器

  可以把过滤器理解为在容器中和servlet同一级别的组件,在容器中有被定义的生命周期,容器启动时会根据部署文件加载过滤器并执行其init方法,请求到来时才会调用doFilter  方法,和servlet组件很类似的是,过滤器需要实现javax.servlet.Filter接口,并充写其生命周期方法。

  值得注意的是:目标资源中的servlet或jsp执行完毕后,响应就会发送,因此如果是实现一个输出过滤器就要对输出进行处理即code2部分,则需要使用包装器,由于对原理不是很明白,因此暂略过,也是作为研究tomcat源码的思考课题!

  下面是过滤器的工作流程:

  技术分享图片

  代码目录

  技术分享图片

  • SimpleFilter.java
技术分享图片
 1 package filter;
 2 import java.io.IOException;
 3 import java.io.PrintWriter;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 /**下面将展示其在容器中的生命周期方法,和servlet和容器的关系的类似。首先过滤器不能改变请求对象属性,但可以根据请求做响应处理!
12 *    结合具体应用:init都初始化什么?销毁呢? 过滤链不能调用init/destory方法??servlet被包含在过滤器中,其生命周期执行完毕还要等过滤器完毕后容器才会发送响应
13 *    tomcat原理思考:doFilter定位的资源已经填写了响应,容器不立即发送而是还要回到过滤器继续执行,怎么实现的,感觉很神秘??
14 *    带着这些疑惑,写一些应用案例!
15 */
16 public class SimpleFilter implements Filter {
17     private String ENCODE;//容器启动即初始化该成员变量
18     
19     @Override//初始化
20     public void init(FilterConfig filterConfig) throws ServletException {
21         ENCODE = filterConfig.getInitParameter("charset");
22         System.out.println("init方法被执行"+ENCODE);
23     }
24 
25     @Override//处理方法
26     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
27             throws IOException, ServletException {
28         res.setContentType("text/html;charset=GB2312");
29         PrintWriter out = res.getWriter();
30         out.println("before doFilter");  
31         chain.doFilter(req, res);//使用过滤链,过滤链将res/req传递给下一个过滤器,没有下一个则定位到目标资源即jsp/servlet
32         out.println("after doFilter");
33         out.close();
34     }
35 
36     @Override//销毁
37     public void destroy() {
38         System.out.println("销毁方法 被执行!");
39     }
40 
41 }
View Code

  服务器启动时会调用init方法,config对象封装了来自部署文件中的初始化参数,使得请求到来时doFilter方法可以访问已经初始化的成员变量。

  • web.xml

   和servlet组件类似,我们需要部署给容器;具体解释看注释:

技术分享图片
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 3   <display-name>Servlet&amp;Jsp_servletSession2</display-name>
 4   <filter>
 5           <filter-name>SimpleFilter</filter-name>
 6           <filter-class>filter.SimpleFilter</filter-class>
 7           <init-param>   <!-- 被封装在config对象中 -->
 8             <param-name>charset</param-name>
 9             <param-value>utf-8</param-value>
10         </init-param>
11   </filter>
12   <filter-mapping>
13           <filter-name>SimpleFilter</filter-name>
14           <url-pattern>/test.jsp</url-pattern> <!-- 请求模版或路径 ,即请求会执行该过滤器-->
15           <dispatcher>REQUEST</dispatcher><!-- 请求方式,如果配置就和请求模版是逻辑与的关系       REQUEST表示客户端请求而来 -->
16         <dispatcher>FORWARD</dispatcher><!-- 表示服务器内部转发 -->
17         <!-- <dispatcher>INCLUDE</dispatcher> -->
18         <!-- <dispatcher>ERROR</dispatcher>  -->
19   </filter-mapping>
20   
21   
22   <welcome-file-list>
23     <welcome-file>index.html</welcome-file>
24     <welcome-file>index.htm</welcome-file>
25     <welcome-file>index.jsp</welcome-file>
26     <welcome-file>default.html</welcome-file>
27     <welcome-file>default.htm</welcome-file>
28     <welcome-file>default.jsp</welcome-file>
29   </welcome-file-list>
30 </web-app>
View Code

 

以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章

基于内部片段的graphql过滤器(gatsbyJS)

使用Logstash filter grok过滤日志文件

servlet,过滤器,监听器,拦截器的区别

vue实现简单的过滤器

Scapy BPF 过滤器不工作

在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?