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 ...
随机推荐
- 缕析条分Scroll属性
最近有项目需要使用js原生开发滑动组件,频繁要用到dom元素的各种属性,其中以各种类型的height和top属性居多,名字相近,含义也很容易搞混.因此特地总结归纳了一下常用的知识点,在文末我们来挑战实 ...
- mysql根据.frm和.ibd文件恢复数据表
忠人之事受人之托 起因是因为一位朋友的数据库服务器被重装了,只剩下一个zbp_post.frm和zbp_post.ibd文件.咨询我能不能恢复,确实我只用过mysqldump这种工具导出数据 然后进行 ...
- 安装.NET Framework4.5以上版本受阻怎么办?
安装和卸载 .NET Framework 受阻疑难解答 - .NET Framework | Microsoft Learn Windows RT 8.1.Windows 8.1 和 Windows ...
- ubuntu安装rpm格式包
首先,我们要安装alien这一软件: $sudo apt-get install alien ##alien默认没有安装,所以首先要安装它 $sudo alien xxxx.rpm ##将rpm转换为 ...
- 在不修改代码情况下解决 Chrome 浏览器跨域
前言: 在前后台分离的项目,跨域是经常遇到的问题了.是实际解决方案中,大部分采用服务端配置,而如果只是调试,可以通过配置 Chrome 浏览器实现跨域,以下以 NodeJs 服务为例. 开始: 1. ...
- 不想引入mq?试试debezium
有句话叫做"如无必要,勿增实体". 在一些小型项目当中,没有引入消息中间件,也不想引入,但有一些业务逻辑想要解耦异步,那怎么办呢? 我们的web项目,单独内网部署,由于大数据背景, ...
- MongoDB索引操作和执行计划Explain()详解
一.索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例. 字段内容如下: { "_id" : ObjectId("63 ...
- 使用Jenkins部署Git仓库微服务项目
Jenkins是一个开源的.提供友好操作界面的持续集成(CI)工具.本文使用Jenkins自动构建git仓库中的微服务项目,包括Jenkins的安装,插件的安装:系统环境的配置:docker镜像构建的 ...
- 产品代码都给你看了,可别再说不会DDD(三):战略设计
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- VictoriaLogs:一款超低占用的 ElasticSearch 替代方案
背景 前段时间我们想实现 Pulsar 消息的追踪流程,追踪实现的效果图如下: 实现其实比较简单,其中最重要的就是如何存储消息. 消息的读取我们是通过 Pulsar 自带的 BrokerInterce ...