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>
        这种情况下,过滤器将会作用于直接从客户端发过来的以/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的请求,则要经过这个过滤器的过滤。其它的诸如从客户端直接过来的对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方法传递过来或者直接从客户端传递过来的,则必须经过这个过滤器。
         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的应用几个方面进行了简单的介绍。简单的来说 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。  

目录
相关文章
|
4月前
|
Java API 容器
Filter 过滤器实现
JavaWeb 组件 Servlet 提供了 Filter 过滤功能,其功能是对目标资源的请求和响应进行拦截,对拦截到的请求和响应做出特殊的功能处理,比如我们请求中有一些敏感信息过滤就是利用过滤器过滤。
|
6月前
|
Java 容器
28JavaWeb基础 - 过滤器
28JavaWeb基础 - 过滤器
25 0
|
1月前
|
Python
过滤器
过滤器
9 2
|
8月前
|
应用服务中间件
15-Filter 过滤器2
15-Filter 过滤器2
54 0
|
4月前
|
JavaScript 前端开发
filter() 方法使用
filter() 方法使用
17 0
|
7月前
|
Java 应用服务中间件 Spring
@RefreshScope和过滤器Filter不要这样用
在注册自定义的OncePerRequestFilter所在的类上加了@RefreshScope导致自定义的OncePerRequestFilter不会被注册到上下文。
|
8月前
|
Java
15-Filter 过滤器1
15-Filter 过滤器1
64 0
|
10月前
|
监控 Java 数据库连接
过滤器的应用
在上一篇博客中,我们简单的学习了一下面向切面编程,而过滤器就是对这一思想的应用。那如何在项目中使用呢?
|
11月前
|
API 数据安全/隐私保护 容器
Filter(过滤器)
Filter(过滤器)
|
API 容器
Filter过滤器的简单介绍与使用
Filter过滤器的简单介绍与使用
125 0
Filter过滤器的简单介绍与使用