Filter入门实例
一、介绍
Filter:Filter是Servlet的“加强版”,它主要用于对用户请求进行预处理,也可对HttpServletResponse进行后处理,是个典型的“处理链”。Filter也可以对用户请求产生响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。
使用Filter的完整流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理
二、创建并使用Filter
1、创建Filter处理类(必须实现javax.servlet.Filter接口)
2、web.xml中配置Filter
例1:
// LogFilter.java负责拦截所有的用户请求,并将请求的信息记录在日志中。
1 import java.io.IOException;
2 import javax.servlet.Filter;
3 import javax.servlet.FilterChain;
4 import javax.servlet.FilterConfig;
5 import javax.servlet.ServletContext;
6 import javax.servlet.ServletException;
7 import javax.servlet.ServletRequest;
8 import javax.servlet.ServletResponse;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.annotation.WebFilter;
11
12 @WebFilter(filterName="log"
13 ,urlPatterns={"/"})
14 //@WebFilter(filterName="log",urlPatterns="/*")
15 public class LogFilter implements Filter{
16
17 //FilterConfig可用于访问Filter的配置信息
18 private FilterConfig config;
19
20 //实现初始化方法
21 @Override
22 public void init(FilterConfig config) throws ServletException {
23 // TODO Auto-generated method stub
24 this.config = config;
25 }
26
27 //实现销毁方法
28 @Override
29 public void destroy() {
30 // TODO Auto-generated method stub
31 config = null;
32 }
33
34 //执行过滤的核心方法:该方法就是对每个请求及响应增加额外的处理
35 @Override
36 public void doFilter(ServletRequest request, ServletResponse response,
37 FilterChain chain) throws IOException, ServletException {
38 // TODO Auto-generated method stub
39
40 // -----------下面代码用于对用户请求进行预处理----------------
41 long before = System.currentTimeMillis();
42 System.out.println("开始过滤。。。");
43
44 //将请求转换为HttpServletRequest请求
45 HttpServletRequest hRequest = (HttpServletRequest)request;
46 //输出提示信息
47 System.out.println("Filter已经截取到用户请求的地址:" + hRequest.getServletPath());
48
49 //Filter只是链式处理,请求依然放到目的地址
50 chain.doFilter(request, response);
51
52 //下面代码用于对服务器响应做后处理
53 long after = System.currentTimeMillis();
54 //输出提示信息
55 System.out.println("过滤结束。。。");
56 //输出提示信息
57 System.out.println("请求被定位到" + hRequest.getRequestURI() + " 所花的时间:" + (after - before));
58 }
59
60 }
//web.xml配置
1 <filter>
2 <!--Filter的名字,相当于@WebFilter的urlPatterns属性-->
3 <filter-name>log</filter-name>
4 <filter-class>LogFilter</filter-class>
5 </filter>
6 <filter-mapping>
7 <filter-name>log</filter-name>
8 <!--Filter负责拦截的URL,相当于@WebFilter的filterName属性
9 配置为/*,表示该Filter会拦截所有用户请求-->
10 <url-pattern>/*</url-pattern>
11 </filter-mapping>
演示:
tomcat后台打印日志:
说明:
http://blog.csdn.net/huangcongjie/article/details/7377422
http://www.oschina.net/question/106215_13779
过滤器的生命周期一般都要经过下面三个阶段:
(1)初始化
当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。
(2)过滤
过滤器的大多数时间都消耗在这里。doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。
(2)析构
容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。
关于chain.doFilter(request,response)
他的作用是将请求转发给过滤器链上下一个对象。这里的下一个指的是下一个filter,如果没有filter那就是你请求的资源。 一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起
request -> filter1 -> filter2 ->filter3 -> .... -> request resource.
API说明:
javax.servlet
Interface Filter
public interface Filter
A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.
Filters perform filtering in the doFilter method. Every Filter has access to a FilterConfig object from which it can obtain its initialization parameters, a reference to the ServletContext which it can use, for example, to load resources needed for filtering tasks.
Filters are configured in the deployment descriptor of a web application
Examples that have been identified for this design are
1) Authentication Filters
2) Logging and Auditing Filters
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
- Since:
- Servlet 2.3
| Method Summary | |
|---|---|
void |
destroy() Called by the web container to indicate to a filter that it is being taken out of service. |
void |
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. |
void |
init(FilterConfig filterConfig) Called by the web container to indicate to a filter that it is being placed into service. |
javax.servlet
Interface FilterChain
public interface FilterChain
A FilterChain is an object provided by the servlet container to the developer giving a view into the invocation chain of a filtered request for a resource. Filters use the FilterChain to invoke the next filter in the chain, or if the calling filter is the last filter in the chain, to invoke the resource at the end of the chain.
- Since:
- Servlet 2.3
- See Also:
Filter
| Method Summary | |
|---|---|
void |
doFilter(ServletRequest request, ServletResponse response) Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked. |
三、Filter的作用
假设系统中有多个Servlet,这些Servlet都需要进行一些通用的处理:比如权限控制、记录日志等,这将导致在这些Servlet的service()方法中有部分代码是相同的——为了解决这种代码重复的问题,我们可以考虑把这些通用处理提取到Filter中完成。
其它比如,(1)在Filter的doFilter里面设置request编码的字符集,从而避免每个JSP、Servlet都需要设置
(2)验证用户是否登录,如果用户没有登录,系统直接跳转到登录页面
Filter入门实例的更多相关文章
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】
http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附 ...
- Apache Mina入门实例
一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...
- React 入门实例教程(转载)
本人转载自: React 入门实例教程
- struts入门实例
入门实例 1 .下载struts-2.3.16.3-all .不摆了.看哈就会下载了. 2 . 解压 后 找到 apps 文件夹. 3. 打开后将 struts2-blank.war ...
- Vue.js2.0从入门到放弃---入门实例
最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...
- wxPython中文教程入门实例
这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下 wxPython中文教程入门实例 wx.Window 是一个基类 ...
- Omnet++ 4.0 入门实例教程
http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用. ...
- Spring中IoC的入门实例
Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...
- Node.js入门实例程序
在使用Node.js创建实际“Hello, World!”应用程序之前,让我们看看Node.js的应用程序的部分.Node.js应用程序由以下三个重要组成部分: 导入需要模块: 我们使用require ...
随机推荐
- Reactjs学习笔记
本篇是关于React的简介 ReactJS是Facebook推出的一款前端框架,2013年开源,提供了一种函数式编程思想,拥有比较健全的文档和完善的社区,在React16的版本中对算法进行了革新,称之 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)
1.简介 通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所 ...
- golang channel 未关闭导致的内存泄漏
现象 某一个周末我们的服务 oom了,一个比较重要的job 没有跑完,需要重跑,以为是偶然,重跑成功,因为是周末没有去定位原因 又一个工作日,它又oom了,重跑成功,持续观察,job 在oom之前竟然 ...
- redux的三个概念与三大核心
1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...
- 从redis未授权访问到获取服务器权限
从redis未授权访问到获取服务器权限 好久没写博客了,博客园快荒芜了.赶紧再写一篇,算是一个关于自己学习的简要的记录把. 这里是关于redis未授权访问漏洞的一篇漏洞利用: 首先是redis,靶场搭 ...
- 解决win10/ubuntu端口占用问题
win10解决方案 首先打开cmd命令行 命令行里输入 netstat -ano|findstr 被占用端口号 然后可以看到占用该端口号的pid 输入taskkill -f -pid pid号即可 u ...
- 【Hexo】插件推荐以及使用小技巧
目录 插件推荐 hexo-deployer-git hexo-word-counter hexo-abbrlink hexo-generator-sitemap 小技巧 自定义提交信息 参考资料 He ...
- 每天一道面试题:Spring的Bean生命周期
Spring的Bean生命周期包括以下步骤: 1.实例化(Instantiation):当Spring容器接收到创建Bean的请求时,它会先实例化Bean对象.这个过程可以通过构造函数.工厂方法或者反 ...
- MySQL允许远程登录的授权方法
泛授权方式 数据库本地直接登录上数据库: mysql -h localhost -u root 然后执行以下命令,授权完后直接就可以远程连接上.mysql>GRANT ALL PRIVILEGE ...
- Python colorama 设置控制台、命令行输出彩色文字
为了方便调试代码,经常会向stdout中输出一些日志,但是大量日志,有时不好定位问题. 使用终端打印特定颜色字符串,可以突出显示关键性的信息,帮助用户更好地识别和理解输出内容. https://pyp ...