一、介绍

  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. 防火墙(iptables与firewalld)

    防火墙 iptables 疏通和堵 进行路由选择前处理的数据包:prerouting 处理流入的数据包:input 处理流出的数据包:output 处理转发的数据包:forward 进行路由选择后处理 ...

  2. Nginx配置网站默认https

    Nginx配置网站默认https 一.安装Nginx yum install nginx -y 二.修改nginx.conf vim /etc/nginx/nginx.conf 配置80转443 配置 ...

  3. C语言基础-基础指针

    文章目录 指针 前言 1.什么是指针 2.指针的使用 (1)指针的定义 (2)指针的赋值 (3)指针类型 (4)如何使用指针 3.野指针 (1)导致野指针的原因 ① 未初始化指针 ②指针越界访问 ③指 ...

  4. Vue报错Custom elements in iteration require 'v-bind:key' directives."错误解决

    错误代码 <swiper> <swiper-item v-for="item in banners"> <a :href="item.lin ...

  5. 何时使用Elasticsearch而不是MySql

    MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景.本文将从以下几个方面对它们进行比较和分析: 数据模型 查询语言 索引和搜索 分布式和高可用 性能和 ...

  6. 记一次Android项目升级Kotlin版本(1.5 -> 1.7)

    原文地址: 记一次Android项目升级Kotlin版本(1.5 -> 1.7) - Stars-One的杂货小窝 由于自己的历史项目Kotlin版本比较老了,之前已经升级过一次了(1.4-&g ...

  7. 知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表

    删除数据库中以往的图 MATCH (n) DETACH DELETE n 创建节点 CREATE命令语法 Neo4j CQL"CREATE"命令用于创建没有属性的节点. 它只是创建 ...

  8. Python实现商城购物经典案例

    代码分步骤思路: 商城添加商品:opea_db = [{'store_name': '手机','num': 1}] while True: store_name=input('请输入需要存放的商品(按 ...

  9. Java stream 流

    Java stream 流 中间操作 1.filter 作用:将流中的元素,基于自定义的比较器进行去重 方法定义 Stream<T> filter(Predicate<? super ...

  10. 一次搞定:借助Hutool封装代码快速解决webservice调用烦恼

    前言 相信很多同行哪怕学了许多主流技术,但工作上依然免不了和传统企业打交道,而这样的企业往往还在用webservice做接口交互. 本文是作者近两年和医疗行业的厂家打交道研究出来的一点调用webser ...