一、介绍

  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入门实例的更多相关文章

  1. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  2. Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】

    http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附 ...

  3. Apache Mina入门实例

    一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...

  4. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  5. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

  6. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  7. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下     wxPython中文教程入门实例 wx.Window 是一个基类 ...

  8. Omnet++ 4.0 入门实例教程

    http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用. ...

  9. Spring中IoC的入门实例

    Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...

  10. Node.js入门实例程序

    在使用Node.js创建实际“Hello, World!”应用程序之前,让我们看看Node.js的应用程序的部分.Node.js应用程序由以下三个重要组成部分: 导入需要模块: 我们使用require ...

随机推荐

  1. 修改docker容器端口映射

    原文地址 操作步骤如下 关闭docker systemctl stop dokcer 修改配置文件 位置一般是: /var/lib/docker/containers/containerId/host ...

  2. Mysql基础8-多表查询

    一.多表关系 一对多或者多对一 案例:部门与员工的关系 关系:一个部门对应多个员工,一个员工对应一个部门(不考虑跨部门的特殊情况) 实现:在多的一方建立外键,指向一的一方的主键,这里员工表是多的的一方 ...

  3. Spring-Bean(三)

    Bean生命周期配置 init-method:指定类中的初始化方法名称 destory-method:指定类中销毁方法名称 Bean标签配置 <bean id="UserDao&quo ...

  4. 2021-4-19 vs加速启动小技巧之intellitrace

    在选项界面中将intellitrace的启用关闭后对于程序的打开有加速作用.

  5. vulnhub Necromancer wp

    flag1 nmap -sU -T4 192.168.220.130 有666端口 nc -nvu 192.168.220.130 666 监听回显消息 tcpdump host 192.168.22 ...

  6. CSS3属性 2D转换

    * { margin: 0; padding: 0 } table { border-spacing: 0; border-collapse: collapse; margin: 10px auto ...

  7. webpack是如何处理css/less资源的呢

    上一篇文章 体验了webpack的打包过程,其中js文件不需要我们手动配置就可以成功解析,可其它类型的文件,比如css.less呢? css-loader 首先,创建一个空文件夹,通过 npm ini ...

  8. [Lua] IT技术熟练度生成器 | 根据IT活动记录生成md表格 | 自创

    IT技术熟练度 v1.0 为衡量个人能力水平自创的一套评分机制,根据时间.代码行数.基础理论三个变量生成.最近在学lua,正好练下基本功.效果可见 个人介绍 | 代码统计 - 小能日记 - 博客园 ( ...

  9. 应用管理平台Walrus开源,构建软件交付新范式

    今日,数澈软件Seal(以下简称"Seal")宣布正式开源 Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点. 借助 Walrus 将云原生的 ...

  10. SQL注入简介

    SQL注入(SQL Injection)是一种计算机安全漏洞,它允许攻击者通过操纵应用程序的输入来执行恶意的SQL查询,从而访问.修改或删除数据库中的数据.这种攻击通常发生在应用程序未正确验证.过滤或 ...