`
sailor90
  • 浏览: 10410 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Servlet Specification V2.4——SRV.6 Filtering

阅读更多

SRV.6 Filtering

 

Filters are Java components that allow on the fly transformations of payload and header information in both the request into a resource and the response from a resource.
        这一节描述了Java Servlet v2.4 API中的一部分classes和methods,它们为filter静态和动态的内容提供了一个轻量级的框架。这一节也描述了如何在web应用中配置filters,filter的使用惯例以及它们的实现的语法。
        SRV.14提供了servlet filters的API文档。Filter的配置语法由部署描述符给出,这会在SRV13 “Deployment Descriptor” 中描述。在阅读本章时,读者应该把这些资源作为参考。

 

 

SRV.6.1 What is a filter?

        Filter是一种可反复使用的的代码,它可以传送HTTP request、response的内容,以及header信息。Filters不创建response或者是向servlets那样响应request,但它们可以为request修改或适配资源,还可以为response修改或适配资源。
        Filters可以作用于动态或静态内容。作为本章节来说,提到的动态和静态内容指的是web资源。

  • 对使用filter的开发者来说,下面是filter一些有用的特性:
  • 可以在Request调用资源前访问资源。
  • 可以在对资源的Request执行前被调用。
  • 可以针对包装过的自定义版本request的request header及data进行修改。
  • 可以针对包装过的自定义版本response的response header及data进行修改。
  • 在资源被调用后拦截资源(The interception of an invocation of a resource after its call)。
  • 以特定的顺序,将零个、一个、或多个filter作用于一个servlet,一组servlet,或者静态内容。

 

SRV.6.1.1 Examples of Filtering Components

  • Authentication filters
  • Logging and auditing filters
  • Image conversion filters
  • Data compression filters
  • Encryption filters
  • Tokenizing filters
  • Filters that trigger resource access events
  • XSL/T filters that transform XML content
  • MIME-type chain filters
  • Caching filters

 

 

SRV.6.2 Main Concepts

Filter模型的主要概念都将在本节讨论。
        应用程序开发者可以通过实现javax.servlet.Filter接口来创建一个filter,并且要提供一个公共的无参构造方法。Filter的class文件与其他组成web应用程序的静态内容和其他servlet的class一起打包到Web Archive(war)中。在部署描述符中,filter通过<filter>元素来声明,filter或filters集合可以通过定义<filter-mapping>元素被调用。调用通过把filter映射到一个特定的servlet(通过servlet的逻辑名称)来实现。或者通过URL pattern把filter映射到到一组servlet或者静态内容资源上。

 

SRV.6.2.1 Filter Lifecycle

在部署了web application之后,request致使container去访问web资源之前,container必须设置好filter列表,这些filter必须像下面描述的那样作用于web resources。container必须保证自身已经把filter列表每一个filter按照恰当的class实例化filter,并且调用它的init(FilterConfig config)方法。filter会通过抛出异常来表明它没有正确地运行。如果异常的类型是UnavaliableException,container可以检查exception的isPermanent属性,并且可以选择在下面的某个时间重新尝试实例化。
        部署描述符中声明的filter,在container的每一个JVM中,一个<filter>标签只对应一个实例。Container来提供声明在filter的部署描述符中的filter配置,web application的ServletContext的引用,以及初始化参数集合。
当container接收到request时,container从filter列表中取出第一个filter实例,调用filter的doFilter方法,将参数ServletRequest,ServletResponse和container使用的FilterChain对象的引用传递进去。
        典型的情况下,filter的doFilter方法会被实现以下全部或部分功能模式:

  1. 检查request的headers
  2. 为了修改request headers或者data,doFilter方法可以把传入的request对象用ServletRequest或HttpServletRequest接口的自定义实现包装request对象。
  3. 为了修改request headers或者data,doFilter方法可以用ServletResponse或HttpServletResponse接口的自定义实现包装request对象。
  4. Filter可以调用filter chain中的下一个实体。下一个实体可以是另一个filter,或者如果filter做的调用是部署描述符中配置的最后一个filter,那下一个实体就是目标web resource。下一个实体的调用通过调用filter chain对象上的doFilter方法完成,并且把request和response传递进去。
    Filter chain实现的doFilter方法,通过container提供,必须找出在filter chain中的下一个实体并且调用它的doFilter方法,传进恰当的request和response对象。
    非此即彼的,filter chain可以通过不对下一个实体进行调用的方式阻塞request,把填写response对象的责任留给自己。
  5. 在对filter chain中下一个filter的调用之后,filter可以检验response headers。
  6. 二选一的,filter有可能在执行过程中抛出一个异常来指示一个错误。如果filter在执行doFilter的过程中抛出了UnavailableException,那么container一定不会试图继续执行下面的filter chain。如果exception没有标记为永久的话,它会在接下来的某个时间重新尝试整个chain。
  7. 当filter chain中最后一个filter被调用时,下一个要被存取的实体就是目标servlet或者在chain中最后面的资源。
  8. 在filter实例从container的服务中被移除之前,container必须首先调用filter上的destroy方法来使filter释放掉所有的资源并且执行其他清理操作

 

SRV.6.2.2 Wrapping Requests and Responses

        过滤的核心理念是为了包装request或是response以便可以override行为来执行过滤任务。在这个模型中,开发者不仅有能力在request,response对象上override已有的方法,也可以给某个filter或接下来的filter chain中的目标web资源提供适合某个特定过滤任务的新的API。例如,开发者想用高级output对象继承response对象,这种对象是output stream或者writer,就像某种API,它允许将DOM对象回写至client。
        为了支持这种风格的filter,container必须达到下面的要求。当filter在container filter chain的实现中调用doFilter方法时,container必须保证它传递给filter chain中下一个实体的request对象和response对象和当前调用的filter传递进doFilter方法的是同一个对象。
        当调用者包装request对象或response对象时,包装对象也有相同的要求作用于来自servlet or a filter to RequestDispatcher.forward or RequestDispatcher.include的调用。在这种情况下,被调用的servlet接收到的request和response对象必须和调用者servlet或filter传入的包装对象是相同的。

 

SRV.6.2.3 Filter Environment

在部署描述符中,可以使用<init-params>元素来关联filter的初始化参数。在运行时,这些参数的names和values对于filter来说可以通过filter的FilterConfig对象的getInitParameter和getInitParameterNames方法获得。另外,FilterConfig提供了对web application的ServletContext的访问功能,以便可以装载资源,提供日志功能,以及对ServletContext的attribute列表的存储。

 

SRV.6.2.4 Configuration of Filters in a Web Application

在部署描述符中,filter使用<filter>元素定义。在这个元素中,程序员应定义如以下描述:

  • filter-name:用来把filter映射到一个servlet或URL
  • filter-class:container使用它来定义filter的类型
  • init-params:filter的初始化参数

        还有一些可选的功能,程序员可以定义图标,文本的描述,and a display name for tool manipulation 。Container会按照部署描述符中所定义的,一个filter声明对应一个java class的实例。因此,如果开发者用同样的filter类定义了两个filter的声明,那么同一个filter class就会有两个实例被实例化。

        这里有一个filter声明的例子:SRV.6.2.4-1.png

        一旦在部署描述符中描述声明了一个filter,就需要使用<filter-mapping>元素来定义filter需要作用于的内容,它们可以是web application中的servlets和静态resources。比如,以下的代码片段把Image Filter filter到了ImageServlet这个servlet:SRV.6.2.4-2.png

        Filters可以关联至一组servlets和静态内容,通过<url-pattern>风格的filter mapping:SRV.6.2.4-3.png

        此处,Logging Filter被作用于web application中所有的servlets和静态内容,因为每个匹配“/*”的request URL。
        当使用<url-pattern>风格的元素去执行<filter-mapping>元素的时候,container必须判断request URL是否和<url-pattern>匹配,路径匹配规则参见SRV.11,“Mapping Requests to Servlets”。
        container在构建用来匹配某一特定request URL的filter chain时,其处理过程如下:

  1. 首先,<url-pattern>匹配filter mapping的顺序和出现在部署描述符中的顺序一致。
  2. 其次,<servlet-name>匹配filter mapping的顺序和出现在部署描述符中的顺序一致。

        这样的要求意味着container在接收到request时,会按照下面的内容处理reqeust:

  • 根据SRV.11.2 Specifications of Mappings提到的规则来识别目标web 资源。
  • 如果有filter与servlet name相匹配,并且web资源有<servlet-name>元素,container会依照部署描述符中声明的状态建立filter chain。The last filter in this chain corresponds to the last <servlet-name> matching filter and is the filter that invokes the target Web resource.
  • 如果有filter使用<url-pattern>匹配并且根据SRV.11.2 Specification of Mapping的规则url-pattern匹配request URL,container会依照部署描述符中声明的<url-pattern>的顺序建立chain。The last filter in this chain is the filter that invokes the first filter in the <servlet-name> matching chain, or invokes the target Web resource if there are none.

        高性能的web container会缓存filter chain以便它们不必基于每一个request去计算filter chain。

 

SRV.6.2.5 Filters and the RequestDispatcher

在Java servlet 规范v2.4中的关于filter的新增内容是,通过配置使filter可以在request dispatcher的forward()及include()之下被调用的能力。
        通过在部署描述符中使用新标签<dispatcher>元素,开发者可以在filter-mapping中指出,在以下情况出现的时候,他是否需要filter作用于request:

  1. request直接来自client。这种情况可以通过给<dispatcher>元素设置value为REQUEST来指明,或者不配置任何<dispatcher>元素。
  2. 在request dispatcher之下被执行的request表示web组件通过调用forward()来匹配<url-pattern>或者<servlet-name>。这种情况通过给<dispatch>元素设置value为FORWARD来声明。
  3. 在request dispatcher之下被执行的request表示web组件通过调用forward()来匹配<url-pattern>或者<servlet-name>。这种情况通过给<dispatch>元素设置value为INCLUDE来声明。
  4. Request被SRV.9.9 Error Handling描述的错误页面机制处理来匹配<url-pattern>。这种情况通过给<dispatch>元素设置value为ERROR来声明。
  5. 或者以上情况的任意组合。

举例说明:

        SRV.6.2.5-1.png

客户端以products/...开头的请求,都会触发Logging Filter的调用。但并不会触发request dispatcher的调用。再看下面的代码:

        SRV.6.2.5-2.png

客户端对ProductServlet的请求,都不会触发Logging Filter的调用,也不会在forward()到ProductServlet的时候被调用调用。只有request dispatcher 调用到ProductServlet并且执行include()方法时才会触发。
最终地,

        SRV.6.2.5-3.png

would result in the Logging Filter being invoked by client requests starting /products/... and underneath a request dispatcher forward() call where the request dispatcher has path commencing /products/... (貌似有问题)。

  • 大小: 9.8 KB
  • 大小: 11 KB
  • 大小: 10.2 KB
  • 大小: 8.9 KB
  • 大小: 14.2 KB
  • 大小: 11.3 KB
1
1
分享到:
评论
2 楼 sailor90 2011-08-26  
jeans_1312 写道
很喜欢这篇,文笔不错,学习一下,
期待更多翻译作品

共同学习
1 楼 jeans_1312 2011-08-11  
很喜欢这篇,文笔不错,学习一下,
期待更多翻译作品

相关推荐

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    VSuite.Ramdisk.Srv.Setup 永久试用XX版

    首先很高兴VSuite.Ramdisk.Srv.Setup.4.6.7531.1240总算win 64位系统上实现永久使用了,虽然离完美破解还是很遥远,但是值得庆贺,特此说明: 1、64位系统较32位难破解原因主要在于数字签名上,由于rxvstor.sys是...

    srv蓝屏解决补丁

    标题中的“srv蓝屏解决补丁”指的是针对服务器运行过程中出现的蓝屏问题,特别是由于srv.sys驱动程序导致的问题,而提供的一种修复解决方案。在Windows操作系统中,srv.sys是服务子系统的主要驱动程序,它负责处理...

    Primo.Ramdisk.Srv.Mui.Setup.5.6.0

    Primo Ramdisk(VSuite Ramdisk II) 内存虚拟硬盘软件 使用内存模拟出超快速的硬盘,突破系统IO瓶颈,飞速提升计算机性能 Primo Ramdisk软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘,在这个...

    Java™ Servlet 规范.

    6 概览 .............................. 13 1.1 什么是 Servlet? ..................................................................................................................................13 1.2 ...

    Primo.Ramdisk.Srv.Mui.5.6.

    安装Primo Ramdisk Srv Mui 5.6.0的过程相对简单,用户只需运行"Primo.Ramdisk.Srv.Mui.Setup.5.6.0.exe"这个安装文件,按照向导指示操作即可。值得注意的是,为了激活软件,可能需要使用到"PrDSrv56crk.reg"这个...

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240 win 64 永久试用XX版

    6. **安装过程**:压缩包内的文件“VSuite.Ramdisk.Srv.Setup.4.6.7531.1240 win 64 永久试用XX版”是安装程序,用户解压后运行即可开始安装。安装过程中,用户应按照提示配置Ramdisk的参数,并遵循软件的许可条款。...

    PrimoCache.Srv.Mui.Setup.3.0.2.rar PrimoCache server 3.02 服务器版,中文版,64位

    PrimoCache 是一款可以将物理内存、SSD 硬盘或闪存盘等虚拟成硬盘缓存的软件,它可以自动将硬盘中读取的数据存入物理内存等速度较快的设备,当系统再次需要该数据时它可以很快从缓存设备中读取,而无需再次访问速度...

    VSuite.Ramdisk.Srv.Setup.zip 服务器版

    VSuite.Ramdisk.Srv.Setup.zip VSuite+Ramdisk+.Crack.By.XLTH.rar 包含配置文件

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240服务器版

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240是一款专为服务器设计的内存虚拟硬盘软件,它充分利用了服务器内存的高速性来创建临时的虚拟硬盘,以此提升数据的读写速度并减轻对物理硬盘的磨损。这款工具的核心理念在于将...

    srv.exe 空连接接开telnet

    嘿嘿。ipc入侵里开telnet需要用的srv 个人收集来的。。奉上

    srv.cpp.tar.gz_Server

    标题中的“srv.cpp.tar.gz_Server”表明这是一个与服务器端编程相关的项目,主要涉及C++语言,因为源代码文件“srv.cpp”通常代表C++程序。这个压缩包包含了一个名为“srv.cpp”的文件,我们可以推断这可能是服务器...

    srv.rar_srv

    标题中的“srv.rar_srv”可能是指一个压缩包文件,其中包含了一个名为“srv”的服务器端程序。这个程序基于socket编程,用于实现简单的通信服务。在IT领域,socket编程是网络编程的基础,它允许两个或多个应用程序...

    History_07_Srv.txt

    History_07_Srv.txt

    srv.rar_聊天工具

    【标题】"srv.rar_聊天工具" 涉及的核心知识点是聊天工具的服务器端开发,其中使用了winsock编程技术。Winsock是Windows操作系统中的一个API,它为应用程序提供了网络通信的能力,使得开发者能够创建基于TCP/IP协议...

    srv.rar_srv_服务端 DELPHI_服务端集合

    《srv.rar_srv_服务端 DELPHI_服务端集合》是一个综合性的资源包,主要针对的是使用DELPHI开发服务端应用的初学者。这个压缩包包含了一系列与srv服务端相关的材料,旨在帮助用户理解srv服务端的工作原理,并提供...

    SAS94_09P3PC_70068130_Win_X64_Wrkstn_Srv.txt

    SAS9.4,sid码更新日期到2020年5月30日。 sas工具9.4版本,的sid更新代码,直接把begin里的内容做替换 或者直接使用renewsas进行更新

    tac_plus_srv.zip

    tac_plus_srv.zip服务器源码。ubuntu下解压安装,方法都在对应的文档中

    Primo.Ramdisk.Srv.Mui.Setup.6.3.1.zip

    压缩包中的Primo.Ramdisk.Srv.Mui.Setup.6.3.1.exe是主安装程序,用户可以通过运行这个文件来安装Primo Ramdisk的服务器版。该程序集成了服务器端的所有功能,包括动态分配内存、设置内存盘大小、配置启动项等,使得...

Global site tag (gtag.js) - Google Analytics