码迷,mamicode.com
首页 > 其他好文 > 详细

Filter过滤器

时间:2018-07-07 20:28:46      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:逻辑   初始   处理   system   mapping   目标   port   test   服务   

  • 什么是过滤器

  可以把过滤器理解为在容器中和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过滤器

标签:逻辑   初始   处理   system   mapping   目标   port   test   服务   

原文地址:https://www.cnblogs.com/10000miles/p/9277842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!