zoukankan      html  css  js  c++  java
  • filter过滤器

            过滤器,刚看到这个概念的时候,让小编想到刚刚给家里买的净水器,由于妈妈陪读的地方水质比較差,所以就买了一个净水器。那么什么是过滤器呢?结合我们生活中的知识,我们知道,过滤器是输送介质管道上必不可少的一种装置,通常安装在减压阀、泄压阀、定水位阀 ,方工过滤器其他设备的进口端设备。过滤器有一定规格滤网的滤筒后,其杂质被阻挡,当须要清洗时,仅仅要将可拆卸的滤筒取出,处理后又一次装入就可以。因此。使用维护极为方便。

    机缘巧合,在近期的项目中也遇见了过滤器Filter。今天这篇博客。小编就主要简单的介绍一下过滤器,希望对须要的小伙伴有帮助。还请小伙伴们多多不吝赐教哦`(*∩_∩*)′。

             Filter简单介绍

             Filter 技术是servlet 2.3 新添加的功能。

    servlet2.3是sun公司于2000年10月公布的,它的开发人员包含很多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多參与者的共同努力下,servlet2.3比以往功能都强大了很多,并且性能也有了大幅提高。当中最重要的就是filter功能.它使用户能够改变一个request和改动一个response. Filter 不是一个servlet。它不能产生一个response,它能够在一个request到达servlet之前预处理request,也能够在response离开servlet时处理response.换种说法,filter事实上是一个“servlet chaining“。

             Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。

    在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序类似,它由 Servlet 容器进行调用和运行 Filter 程序须要在 web.xml 文件里进行注冊和设置它所能拦截的资源:Filter 程序能够拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。

             Filter基本工作原理

             当在 web.xml 中注冊了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个 Filter 就成了 Servlet 容器与该 Servlet 程序的通信线路上的一道关卡。该 Filter 能够对 Servlet 容器发送给 Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的对应进行拦截。能够决定是否将请求继续传递给 Servlet 程序。以及对请求和对应信息是否进行改动 在一个 web 应用程序中能够注冊多个 Filter 程序。每一个 Filter 程序都能够对一个或一组 Servlet 程序进行拦截。 若有多个 Filter 程序对某个 Servlet 程序的訪问过程进行拦截,当针对该 Servlet 的訪问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。

    Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。

           经常使用标签说明

           以小编近期项目中的filter为例,简单介绍一下filter中经常使用的标签。代码例如以下所看到的:   

    <?

    xml version="1.0" encoding="UTF-8"?

    > <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置Spring的核心监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置Struts2的核心过滤器 --> <!--定义Filter--> <filter> <!-- Filter的名字 --> <filter-name>struts2</filter-name> <!-- Filter的实现类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义Filter拦截的URL地址 --> <filter-mapping> <filter-name>struts2</filter-name> <!-- Filter负责拦截的URL 所有以/的请求,假设<url-pattern>/*.action </>,将会以拦截*.action的请求--> <url-pattern>/*</url-pattern> </filter-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

            以下简单简单说一下。在不同的情况下过滤器是怎样进行请求的。

            第一个样例     

    <filter-mapping>
    <filter-name>Logging Filter</filter-name>
    <url-pattern>/products/*</url-pattern>
    </filter-mapping>
            这样的情况下。过滤器将会作用于直接从client发过来的以/products/…開始的请求。由于这里没有制定不论什么的< dispatcher >元素。默认值是REQUEST。

            第二个样例 

    <filter-mapping>
    <filter-name>Logging Filter</filter-name>
    <servlet-name>ProductServlet</servlet-name>
    <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
           这样的情况下,假设请求是通过request dispatcher的include方法传递过来的对ProductServlet的请求。则要经过这个过滤器的过滤。

    其他的诸如从client直接过来的对ProductServlet的请求等都不须要经过这个过滤器。
    指定filter的匹配方式有两种方法:直接指定url-pattern和指定servlet。后者相当于把指定的servlet对应的url-pattern作为filter的匹配模式,filter的路径匹配和servlet是一样的,都遵循servlet规范中《SRV.11.2 Specification of Mappings》一节的说明。

             第三个样例     

    <filter-mapping>
    <filter-name>Logging Filter</filter-name>
    <url-pattern>/products/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
            在这样的情况下。假设请求是以/products/…开头的。并且是通过request dispatcher的forward方法传递过来或者直接从client传递过来的,则必须经过这个过滤器。
             Filter的应用

             1、是浏览器不缓存页面的过滤器

             有 3 个 HTTP 响应头字段都能够禁止浏览器缓存当前页面,它们在 Servlet 中的演示样例代码例如以下:      

    response.setDateHeader("Expires",-1);
    
    response.setHeader("Cache-Control","no-cache"); 
    
    response.setHeader("Pragma","no-cache"); 
             并非所有的浏览器都能全然支持上面的三个响应头。因此最好是同一时候使用上面的三个响应头。

             2、字符编码的过滤器

             通过配置參数encoding致命使用何种字符编码,以处理HTml Form请求參数的中文问题。当然filter的应用并不仅仅仅仅有这些。小伙伴们还能够自己去发现哦`(*∩_∩*)′。

              小编寄语:该博文。小编主要简单的介绍了filter。从生活中入手,生活中的filter是什么。相信小伙伴们都知道啦。从而映射到java中的filter。小编从filter的简单介绍、filter的工作原理、filter中经常使用的标签以及filter的应用几个方面进行了简单的介绍。简单的来说 当client发出Web资源的请求时,Webserver依据应用程序配置文件设置的过滤规则进行检查。若客户请求满足过滤规则。则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中能够被改动,也能够依据条件让请求不发往资源处理器,并直接向客户机发回一个响应。

    当资源处理器完毕了对资源的处理后,响应信息将逐级逆向返回。

    相同在这个过程中,用户能够改动响应信息,从而完毕一定的任务。  

  • 相关阅读:
    UI、JS框架----Bootstrap、Metro
    重构—改善既有代码的设计4——构筑测试体系
    重构—改善既有代码的设计3——代码的坏味道
    正则匹配-URL-域名
    pgAdmin的数据恢复
    重构—改善既有代码的设计2
    重构—改善既有代码的设计1
    Levenshtein Distance,判断字符串的相似性
    最大匹配字符串LCS,The Longest Common Substring
    email
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7275480.html
Copyright © 2011-2022 走看看