什么是过滤器, 过滤器不是servlet, 它是一个可以 传送请求 或者 修改响应 的对象, 它是请求到达Servlet前的预处理程序, 以及响应离开Servlet后的后处理程序.
稍微具体点儿说, 过滤器可以:
1. 在一个servlet被调用前 截获 该调用
2. 在一个servlet被调用前 检查 请求
3. 修改 在实际请求中 提供的 请求对象的 请求头 和 请求数据
4. 修改 在实际响应中 提供的 响应对象的 响应头 和 响应数据
5. 在一个servlet被调用之后 截获该调用
一个过滤器 必须实现 java.servlet.filter 接口, 并定义它的三个方法:
1. void init(FilterConfig config) throws ServletException; 在过滤器执行过滤前调用, 设置过滤器的配置对象。
2. void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException; 执行实际的过滤工作。
3. void destroy(); 在过滤器执行过滤后调用。
服务器先调用一次 init 方法为服务准备过滤器, 然后在请求需要使用过滤器的任何时候调用doFilter 方法。 FilterConfig接口检索过滤器名,初始化参数 以及Servlet上下文。
服务器调用 destroy 来指示过滤器已经完成过滤 。
在 doFilter 方法中,过滤器可以对请求对象和响应对象做它想做的一切 。过滤器调用 chain.doFilter() 方法就将控制权传递给下一个过滤器了。不过还没完,精彩的来咯,在这个调用返回后(整个过滤链的执行有点类似算法里面的先递推再回归),在 doFilter 方法的最后可以对 响应对象 做一些其他的事情。如果过滤器想终止请求的处理,或者想获得对响应的完全控制,就可以不调用下一个过滤器!
好啦,结合例子来加深理解吧:
[例1]记录请求的持续时间:(原代码取自Tomcat4.0)
public class TimeFilter implements Filter {
//保存在初始化时才能得到的FilterConfig对象的引用
//利用它可以检索过滤器名,配置参数,还有所处的Servlet上下文
private FilterConfig config = null;
public void init(FilterConfig config)throws ServletException{
this.config = config;
}
public void destroy() {
config = null; //释放对FilterConfig的引用,以便能被垃圾回收
}
public void doFilter(ServetRequest req,ServletResponse rep,FilterChain chain)throws IOException,ServletException {
long begin = System.currentTimeMillis();//请求到达的时间
chain.doFilter();
long end = System.currentTimeMillis();//响应离开Servlet的时间
String name = "";
if (req instanceof HttpServletRequest) {
name = ((HttpServletRequest)req).getRequestURI();
}
//私有的FilterConfig引用要派上用场了
config.getServletContext.log(name + " : " + (end - begin) + "ms");
}
}
然后在web.xml文件里面这样配置一下:
<filter>
<filter-name>timeFilter</filter>
<filter-class>TimeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>timeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上面的配置使过滤器应用于所有对服务器的请求(静态和动态),正是我们需要的“计时过滤器”!如果我们连接一个简单的页面,可能的输出:
2006-10-21 11:53:00 /sprapp/index.html : 10ms
稍微具体点儿说, 过滤器可以:
1. 在一个servlet被调用前 截获 该调用
2. 在一个servlet被调用前 检查 请求
3. 修改 在实际请求中 提供的 请求对象的 请求头 和 请求数据
4. 修改 在实际响应中 提供的 响应对象的 响应头 和 响应数据
5. 在一个servlet被调用之后 截获该调用
一个过滤器 必须实现 java.servlet.filter 接口, 并定义它的三个方法:
1. void init(FilterConfig config) throws ServletException; 在过滤器执行过滤前调用, 设置过滤器的配置对象。
2. void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException; 执行实际的过滤工作。
3. void destroy(); 在过滤器执行过滤后调用。
服务器先调用一次 init 方法为服务准备过滤器, 然后在请求需要使用过滤器的任何时候调用doFilter 方法。 FilterConfig接口检索过滤器名,初始化参数 以及Servlet上下文。
服务器调用 destroy 来指示过滤器已经完成过滤 。
在 doFilter 方法中,过滤器可以对请求对象和响应对象做它想做的一切 。过滤器调用 chain.doFilter() 方法就将控制权传递给下一个过滤器了。不过还没完,精彩的来咯,在这个调用返回后(整个过滤链的执行有点类似算法里面的先递推再回归),在 doFilter 方法的最后可以对 响应对象 做一些其他的事情。如果过滤器想终止请求的处理,或者想获得对响应的完全控制,就可以不调用下一个过滤器!
好啦,结合例子来加深理解吧:
[例1]记录请求的持续时间:(原代码取自Tomcat4.0)
public class TimeFilter implements Filter {
//保存在初始化时才能得到的FilterConfig对象的引用
//利用它可以检索过滤器名,配置参数,还有所处的Servlet上下文
private FilterConfig config = null;
public void init(FilterConfig config)throws ServletException{
this.config = config;
}
public void destroy() {
config = null; //释放对FilterConfig的引用,以便能被垃圾回收
}
public void doFilter(ServetRequest req,ServletResponse rep,FilterChain chain)throws IOException,ServletException {
long begin = System.currentTimeMillis();//请求到达的时间
chain.doFilter();
long end = System.currentTimeMillis();//响应离开Servlet的时间
String name = "";
if (req instanceof HttpServletRequest) {
name = ((HttpServletRequest)req).getRequestURI();
}
//私有的FilterConfig引用要派上用场了
config.getServletContext.log(name + " : " + (end - begin) + "ms");
}
}
然后在web.xml文件里面这样配置一下:
<filter>
<filter-name>timeFilter</filter>
<filter-class>TimeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>timeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上面的配置使过滤器应用于所有对服务器的请求(静态和动态),正是我们需要的“计时过滤器”!如果我们连接一个简单的页面,可能的输出:
2006-10-21 11:53:00 /sprapp/index.html : 10ms
发表评论
-
Tag教程
2010-02-27 14:58 570EL 表达式语言 http://www.code-123. ... -
server.xml元素属性详解
2008-08-23 14:12 690属性名解析 server port ... -
虚拟主目录的建立方法
2008-08-23 14:18 757建立站点www.prodream.com的步骤: 1.建立需 ... -
JSP动作指令
2008-08-23 14:35 628一、Include指令<jsp:include>标 ... -
JSP动作标签
2008-08-23 15:29 784jsp指令负责告诉jsp引擎如何把页面翻译成servlet. ... -
JSP的useBean动作指令-JSP页面加载过程与scope取值
2008-08-23 15:34 1936Jsp的useBean动作标签的JSP页面加载过程 < ... -
JSP内部对象与方法详解
2008-08-23 16:10 705① out - javax.servlet.jsp.jsp ... -
基于端口的虚拟主机的建立(终于晓得为什么没有成功的原因了)
2008-08-23 16:31 730基于端口号的虚拟主机 server.xml中@一个<C ... -
servlet-动态页面
2008-08-27 10:15 761一、动态页面与动态html页面的区别<?xml:name ... -
tomcat-建立虚拟子目录
2008-08-27 14:16 7231.最简单的方法是,在主目录下建立一个文件夹,这个就是一个虚拟 ... -
Servlet运行过程
2008-08-28 09:03 1157一.servlet的特点 二、servlet程序查询数据库的 ... -
servlet配置运行
2008-08-28 15:25 1031一.servlet的注射与运行 二、serv ... -
servlet-filter的一个例子
2008-08-28 16:39 769Filter的意思是可以在Servlet实例进行实质性的处理之 ... -
JSP/Servlet:控制器(Servlet)
2008-09-08 23:54 1110Model 2 架構將應用程式的Web 層區分為Contro ... -
http协议请求行,状态行,响应状态行
2008-09-09 21:19 54541.请求行 格式:请求方式 资源路径 HTTP版本号<C ... -
URLPath匹配原则
2008-09-11 22:50 789URLPath匹配原则 路 ... -
web.xml原理与元素解析
2008-09-11 22:56 1584(tomcat实际上是一个servlet容器,而Apache是 ... -
乱码问题
2008-09-11 23:03 819预备知识: 1.字节和un ... -
过滤器的使用场合
2008-09-11 23:18 862过滤器可以在请求到达JSP或Servlet之前或响应返 ... -
servlet常用类
2008-09-22 12:58 714Servlet常用接口public interface S ...
相关推荐
4899过滤器4899过滤器4899过滤器4899过滤器4899过滤器4899过滤器4899过滤器
Cuckoo 过滤器是近似集合成员查询的布隆过滤器替代品。虽然 Bloom 过滤器是众所周知的节省空间的数据结构,可以服务于“如果项目 x 在一个集合中?”之类的查询,但它们不支持删除。它们启用删除的差异(如计算 ...
登陆过滤器登陆过滤器登陆过滤器登陆过滤器登陆过滤器登陆过滤器登陆过滤器登陆过滤器登陆过滤器
JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器
为了解决在干法除尘煤气化技术中广泛使用的飞灰过滤器陶瓷滤芯断裂问题,以神华煤制油装置飞灰过滤器为研究对象,将采用Fe3Al材料制得的滤芯在过滤器中使用。通过测定合成气及飞灰特性、过滤效率、流量-压差曲线、滤饼...
过滤器
不允许未登陆用户访问的过滤器配置,filter,用户登陆过滤器,session判断用户登陆 不允许未登陆用户访问的过滤器配置
SpringBoot的filter过滤器 一、过滤器的作用和概述 1.1 简述 1.2 使用场景 二、自定义过滤的两种方式 2.1 第一种方式 2.1.1 启动类增加注解@ServletComponentScan 2.1.2 定义一个filter类 2.1.3. 测试 2.2 第二种...
STM32的CAN过滤器详解
布隆过滤器,大家学过数据结构的应该都清楚,一般的字典树要实现嵌入和查找都内存的消耗非常大,布隆过滤器有BloomFilter,string, BKDRHash, APHash, DJBHash> bf五个参数你要查找的元素个数,查找元素类型,三个...
C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否...
关于JAVA过滤器的编写,和一些要求!代码精简,方便使用
struts2配置过滤器 示例代码
拦截器和过滤器的区别,从实现原理到应用场景各处区别
servlet过滤器实例经典过滤器,手把手交你配置过滤器,五大常用过滤器源码,走过路过的同事们注意了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Servlet过滤器的简单使用,实现一个登陆界面。代码和博文几乎一致。
使用Java多线程实现管道过滤器,本文档写了六个线程,五个管道,内容很简单,如果想要复杂功能请手动添加。
简单过滤器防止恶意攻击 java中的用法
配置Filter过滤器处理JSP中文乱码 参考Tomcat服务器目录webapps的examples示例 简单配置步骤: 1.在项目web.xml文件添加过滤器标记和; 2.实现过滤器代码; 3.对Tomcat服务器conf目录里的Server.xml文件配置...
C# MVC 过滤器防止SQL注入