一个、总结

  简单的说,Filter的作用就是拦截(Tomcat的)service(Request,Response)方法。拿到Request、Response对象进行处理。然后释放控制。继续自己主动流转。其运用的还是“分层”的思想。

  至于为什么要增加这一层,为什么要对Request、Response对象进行拦截。个人感觉根本原因是为了对多个server资源(Servlet、JSP等)的请求、对应进行一些公共的设置。这里强调的是“多个”。

假设是一个资源,就没有设置Filter的必要,由于仅仅须要在这个资源须要的地方(之前)设置Request、Response就可以。也就是“设置”放到哪里都能够,由于非常多请求、响应有非常多共同的设置,所以将共同之处抽出来作为一层。就是所谓的Filter。

作用例如以下图:

传统调用:

加上Filter:

二、FilterChain

  当几个Servlet有一些同样的设置(过滤),而另几个Servlet有其他同样的设置……,这样一个Filter是不能完毕全部的过滤,所以就须要多个Filter协作来共同完毕这项任务。

于是著名的FilterChain就出来了。那么这个FilterChain中的多个Filter是怎样协作的呢?

  每一个Filter的职能不同,当一个Servlet的请求到达后,这个请求就会沿着这条Filter链,一个一个走过,走到它须要的Filter时。这个Filter就会进行对它的Request、Response进行操作。完成后自己主动向下流转。这就是所谓的职责链模式。

  每一个Filter有3个方法:

  Ø  init(FilterConfig filterConfig)

  Ø  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  Ø  destroy()

  三个方法(以下进行具体介绍)依次运行,一个Filter链中的多个Filter的运行顺序例如以下图:

  

  即:运行第一个过滤器的chain.doFilter()之前的代码---->第二个过滤器的chain.doFilter()之前的代码---->……---->第n个过滤器的chain.doFilter()之前的代码---->所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码---->第n个过滤器的chain.doFilter()之后的代码---->……---->第二个过滤器的chain.doFilter()之后的代码---->第一个过滤器的chain.doFilter()之后的代码。

三、主要接口与方法

  首先Servlet过滤器API包括了3个接口,它们都在javax.servlet包中,各自是Filter接口、FilterChain接口和FilterConfig接口。

使用

  Ø  全部的过滤器都必须实现Filter接口。

该接口定义了init(),doFilter(),destory()三个方法。

  Ø  FilterChain接口作为了doFilter0方法的參数:  doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

  Ø  FilterConfig接口作为了init()方法的參数: init(FilterConfig filterConfig)

  也就是,过滤器类将实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口。该过滤器类的—个引用将传递给FilterChain对象,以同意过滤器把控制权传递给链中的下一个资源。FilterConfig对象将由容器提供给过滤器,以同意訪问该过滤器的初始化数据。

以下对3个接口与所包括的方法进行简要介绍:

Filter接口

  1)       public void init (FilterConfig filterConfig) throws  ServletException.

  当開始使用servlet过滤器服务时。Web容器调用此方法一次。为服务准备过滤器;即通过FilterConfig对象拿到过滤器的初始化參数。即配置文件里配置的信息。然后在须要使用过滤器的时候调用doFilter()。并传递配置信息。

  2)       public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

  每一个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被运行。doFilter方法中,过滤器能够对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象加入新的行为。

  过滤器通过传送至此方法的FilterChain參数,调用chain.doFilter()将控制权传送给下一个过滤器。当这个调用返回后,过滤器能够在它的 Filter方法的最后对响应做些其他的工作。假设过滤器想要终止请求的处理或得到对响应的全然控制,则能够不调用下一个过滤器。而将其重定向至其他一些页面。

当链中的最后一个过滤器调用chain.doFilter()方法时。将执行最初请求的Servlet。

  3)       public voiddestroy()

  假设doFilter()法里的全部线程退出或已超时,容器调用此方法。

server调用destory()以指出过滤器已结束服务。用于释

放过滤器占用的资源。

FilterChain接口

  1)     public voiddoFilter(ServletRequest request,ServletResponse response)   throws
java.io.IOException,ServletException

  此方法是由Servlet容器提供给开发人员的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤   器,假设是最后一个过滤器,则下一个就调用目标资源。

FilterConfig接口

 FilterConfig接口检索过滤器名、初始化參数以及活动的Servlet上下文。

  1)       public java.lang.String getFilterName()

  2)       public  ServletContext  getServletContex()

  3)       public java.lang.String  getlnitParameter(java.lang.String name)

  4)       public java.util.Enumeration getlnitParameterNames()

四、配置使用

  过滤器通过Web应用程序中的配置描写叙述符web.xml文件里的明。包含部分<filter>、<filter-mapping>:

<filter>。主要包含:

  1)       <filter-name>和<f'flter-class>两个必须的子元素

  2)       <icon>、<init-param>,<display-name>,<description>这4个可选的子元素。

  <filter-name>子元素定义了—个过滤器的名字,<filter-class>指定了由容器加载的实际类,<init-param>子元素为过滤器提供初始化參数。

<filter-mapping>主要由

  1)       <filter-name>,<servlet-name>和<url-pattem>子元素组成。

<servlet-name>将过滤器映射到一个或多个Servlet上,<url-pattem>将过滤器映射到—个或多个随意特征的URL的JSP页面。

<url-pattem>的4种配置方式: 

  <filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter> <!--精确匹配,不採用不论什么修饰符 -->
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</filter-mapping> <!--扩展匹配,由*号和扩展名组成 -->
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> <!--路径前缀匹配。包括一个文件夹和一个/* -->
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping> <!--全匹配。使用/* -->
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

五、代码演示样例:


Filter类:

package com.bjpowernode.drp.util.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import org.omg.CORBA.Request;
/**
* 採用Filter允许处理字符集
* @author v-wangzhip
*/
public class CharsetEncodingFilter implements Filter {
private String encoding;
@Override
public void destroy() {
// TODO Auto-generated method stub }
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//System.out.println("CharsetEncodingFilter---->begin");
//设置字符集
request.setCharacterEncoding(encoding);
//继续向下运行
chain.doFilter(request, response);
//System.out.println("CharsetEncodingFilter---->end");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding=filterConfig.getInitParameter("encoding");
System.out.println("encoding---->"+ encoding);
}
}

Web.xml配置:

  <filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>

六、总结

  个人感觉,Filter是将多个请求-响应中公共的须要设置的东西提出来插入到请求-响应之间的一个中间层。

多个Filter组成一个FilterChain。每一个Filter有自己的职能。能依照一定规则来处理到达的请求和响应,体现了职责链模式。

Filter仅仅对post请求起作用,它提供了一种声明式服务。具有可插拔能力,即能够任意开启和关闭。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Filter基金会的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?

    作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...

  3. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  4. 以bank account 数据为例,认识elasticsearch query 和 filter

    Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...

  5. AngularJS过滤器filter-保留小数,小数点-$filter

    AngularJS      保留小数 默认是保留3位 固定的套路是 {{deom | number:4}} 意思就是保留小数点 的后四位 在渲染页面的时候 加入这儿个代码 用来精确浮点数,指定小数点 ...

  6. 挑子学习笔记:特征选择——基于假设检验的Filter方法

    转载请标明出处: http://www.cnblogs.com/tiaozistudy/p/hypothesis_testing_based_feature_selection.html Filter ...

  7. Xamarin和微软发起.NET基金会

    新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...

  8. [模拟电路] 2、Passive Band Pass Filter

    note: Some articles are very good in http://www.electronics-tutorials.ws/,I share them in the Cnblog ...

  9. AngularJS过滤器filter-时间日期格式-渲染日期格式-$filter

    今天遇到了这些问题索性就 写篇文章吧 话不多说直接上栗子 不管任何是HTML格式还是JS格式必须要在  controller 里面写 // new Date() 获取当前时间 yyyy-MM-ddd ...

随机推荐

  1. Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

    主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...

  2. VPS服务器下的centos网卡配置详解……

    自动激活网卡 安装了CENTOS 6.X后,每次启动了系统都需要手动激话网卡,以下方法可以在系统启动后自动激活网卡. cat /etc/sysconfig/network-scripts/ifcfg- ...

  3. android用canvas绘制两种波纹效果

     波形效果有几种不同的呈现形式,比如从中间向四周散开的波形,也就是熟知的水涟漪:还有上下波动的曲线,像五线谱等.英文中可以称作Wave或者Ripple,所以暂且叫它们WaveView.WaveLayo ...

  4. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

    前言   由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文.(之前看小强也写过一篇,这里通过自身的分析完整的总结一下以下6种 ...

  5. Servlet的学习之Session(1)

    在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...

  6. spring mvc ModelAndView向前台传值

    今天在做项目的时候遇到一个问题,把第一个页面保存的id传到第三个页面中去用,原来是在controller层加了一个全局变量控制的,但是后来发现这个变量实现不了我要的功能,于是查了一下,原来ModelA ...

  7. XML wsdl soap xslt xsl ide

    XML wsdl soap  xslt xsl ide 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn. ...

  8. JSTL解析——002——core标签库01

    javaEE5之前的版本需要引用JSTL相关的jar包.tld文件等,JAEE5之后就不用这么麻烦了, 如果你的还是不能使用就去官网下载(jstl.jar和standard.jar)这两个jar包,将 ...

  9. java(样品集成框架spring、spring mvc、spring data jpa、hibernate)

    这是你自己的参考springside集成框架的开源项目.主要的整合spring.spring mvc.spring data jpa.hibernate几个框架,对于这些框架中仍然感觉更舒适sprin ...

  10. C文件操作的语言fgets()

        谈fgets(..)功能.     原型  char *  fgets(char * s, int n,FILE *stream);     參数:          s: 字符型指针.指向存 ...