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 }
服务器启动时会调用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&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>
以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章