`

java-WEB中的过滤器Filter

阅读更多

             过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
       在这之后,过滤器可以作如下的选择:
  ①以常规的方式调用资源(即,调用servlet或JSP页面)。
  ②利用修改过的请求信息调用资源。
  ③调用资源,但在发送响应到客户机前对其进行修改。
  ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。


定义:必须实现javax.servlet.Filter接口.


public class ClearCacheFilter implements Filter {
    public ClearCacheFilter() {
    }


Servlet容器在卸载过滤器实例前调用该方法 。该方法在Filter的生命周期中仅执行一次。 在这个方法中,可以释放过滤器使用的资源 .


    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    }


// 这是Servlet过滤器的初始化方法.

在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。Web容器(servlet容器)创建 Filter 对象实例后,将立即调用该 Filter 对象的 init 方法


  Init 方法在 Filter 生命周期中仅执行一次, servlet容器在调用 init 方法时,会传递一个包含 Filter 的配置和运行环境的 FilterConfig 对象( FilterConfig的用法和ServletConfig类似 ) 利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数


    public void init(FilterConfig fConfig) throws ServletException {
    }
}


注意:  1、doFilter方法 参数不是HttpServletRequest和HttpServletResponse,但是我们在servlet中,请求的一般是http协议,这 时,如果需要处理Http的请求,可以将ServletRequest 强制转换为HttpServletRequest,ServletResponse 强制装换为HttpServletResponse,然后进行处理,如设置Http响应头信息等.

2、与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口


作用: Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,

     从而在 Servlet 进行响应处理的前后实现一些特殊的功能。

     1 、在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序: Filter , FilterChainFilterConfig.

     2 Filter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序相似,它由 Servlet 容器进行调用和执行.

     3 Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源: Filter 程序可以拦截 Jsp , Servlet, 静态图片文件和静态 html 文件.


原理:

1、在过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。

       例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作: 判断客户端的会话是否有效 对提交的数据进行统一编码 。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

2、在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。

3、若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时, web 容器将把这多个 Filter 程序组合成一个 Filter ( 过滤器链 ) Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致



FilterChain:

1、FilterChain 接口:代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的 doFilter () 方法中。过滤器对象使用 FilterChain 对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。

2、方法doFilter ( ServletRequest request,ServletResponse response)throws java.io.IOException :调用该方法将使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。


FilterConfig:

1、javax.servlet.FilterConfig 接口:该接口类似于 ServletConfig 接口,由容器实现。 Servlet 规范将代表 ServletContext 对象和 Filter 的配置参数信息都封装在该对象中。 Servlet 容器将其作为参数传入过滤器对象的 init () 方法中。

2、String getFilterName () :得到描述符中指定的过滤器的名字。

3、String getInitParameter (String name) : 返回在部署描述中指定的名字为 name 的初始化参数的值。如果不存在返回 null.

4、Enumeration getInitParameterNames () :返回过滤器的所有初始化参数的名字的枚举集合。

5、public ServletContext getServletContext () :返回 Servlet 上下文对象的引用。


Filter的部署:通过 <filter> <filter-mapping> 元素来完成。

<filter> 元素
<filter> 元素用于在 Web 应用程序中注册一个过滤器。
<filter> 元素内
<filter-name> 用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class> 元素用于指定过滤器的完整的限定类名。
< init-param > 元素用于为过滤器指定初始化参数,它的子元素 < param -name> 指定参数的名 < param -value> 指定参数的值。在过滤器中,可以使用 FilterConfig 接口对象来访问初始化参数。
Servlet 容器对部署描述符中声明的每一个过滤器,只创建一个实例。与 Servlet 类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器时,也要注意线程安全的问题


Filter映射:
<filter-mapping> 元素用于设置一个 Filter 所负责拦截的资源。一个 Filter 拦截的资源可通过两种方式来指定: Servlet 名称和资源访问的请求路径 ( url 样式 )
<filter-name> 子元素用于设置 filter 的注册名称。该值必须是在
<filter> 元素中声明过的过滤器的名字 < url -pattern> 设置 filter 所拦截的请求路径 ( 过滤器关联的 URL 样式 )
<servlet-name> 指定过滤器所拦截的 Servlet 名称。
<dispatcher> 指定过滤器所拦截的资源被 Servlet 容器调用的方式 ,可以是 REQUEST,INCLUDE,FORWARD ERROR 之一,默认 REQUEST. 可以设置多个 <dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截

filtermapping里面定义了对文件进行过滤,

   1)、”/*”表示所有URL

   2)、如果*.jsp表示对后缀是.jsp的文件进行过滤

   3)、如果还有其他的页面,如.do或者.action等,那么可以继续添加

    <filter-mapping>这个选项,其中<url-pattern>就填写*.do或者*.action即可。



配置示例:

  <filter>

    <filter-name>EncodingFilter</filter-name>

    <filter-class>manyfilter.EncodingFilter</filter-class>

          <init-param>

              <param-name>encoding</param-name>

             <param-value>utf-8</param-value>

          </init-param>

        <init-param>

           <param-name>blacklist</param-name>

           <param-value>dao</param-value>

       </init-param>

</filter>

<filter-mapping>

    <filter-name>EncodingFilter</filter-name>

    <url-pattern>/test.jsp</url-pattern>

</filter-mapping>

<filter-mapping>

       <filter-name> EncodingFilter </filter-name>

      <url-pattern>*.do</url-pattern>

      <dispatcher>REQUEST</dispatcher>

      <dispatcher>FORWARD</dispatcher>

</filter-mapping>


Filter <dispatcher> 子元素:
<dispatcher> 子元素可以设置的值及其意义:
REQUEST :当用户直接访问页面时, Web 容器将会调用过滤器。如果目标资源是通过 RequestDispatcher include() forward() 方法访问时,那么该过滤器就不会被调用。默认值
  INCLUDE :如果目标资源是通过 RequestDispatcher include() 方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD :如果目标资源是通过 RequestDispatcher forward() 方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR :如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

      关于ERROR的解释:

       ERROR :如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

         当我们访问一个 web 目标资源时,如果服务器没有找到该目标资源,那么服务器就会给出一个 404 错误代码。如果我们给 404 错误代码定义一个页面,那么当 404 错误发生时就会调用该页面,请看以下 web.xml 文件的配置:

  

        <filter-mapping> 
         <filter-name>
myFilter </filter-name>
         <
url -pattern>/ error.jsp </ url -pattern>
         <dispatcher>ERROR</dispatcher>
  </filter-mapping>

        <error-page>
        <error-code>404</error-code>
        <location>/
error.jsp </location>
  </error-page>

       当我们访问一个不存在的文件时,就会访问 error.jsp ,但是配置了过滤器对错误页面进行过滤,所以过滤器先接受到请求,然后再转发给 error.jsp



分享到:
评论

相关推荐

    java-web -- servlet 拦截器 过滤器使用

    在Java Web开发中,Servlet、拦截器(Interceptor)和过滤器(Filter)是三个非常重要的概念,它们在处理HTTP请求和响应时起到了关键作用。理解并熟练运用这三者能够帮助开发者实现更高效、更安全的Web应用。 首先...

    JAVA Web中过滤器

    在JAVA Web开发中,过滤器(Filter)是一个至关重要的组件,它主要负责在请求被Servlet处理之前或之后执行一些预处理或后处理操作。过滤器是JAVA Servlet API的一部分,通过实现javax.servlet.Filter接口来创建...

    Java-filter过滤器在项目开发中的应用.docx

    Java-filter过滤器在项目开发中的应用 Java-filter过滤器是一种Java EE规范中的一种组件,用于拦截和处理Servlet请求和响应。在项目开发中,Java-filter过滤器可以应用于解决各种问题,以下是其中的两种应用: ...

    cors-filter-2.5 + java-property-utils-1.9.1.zip

    然后,需要在`web.xml`配置文件中定义Filter,指定过滤器类以及相应的配置。配置项可能来自`java-property-utils`库读取的属性文件,如`cors.properties`,其中定义了允许的源和其他CORS策略。 总结来说,这个...

    cors-filter-1.7.jar 和 java-property-utils-1.9.jar

    而`java-property-utils-1.9.jar` 提供了一些用于处理Java属性文件的工具类,这些工具在配置CORS过滤器时可能会用到,例如读取配置文件中的CORS策略。 在配置CORS过滤器时,首先需要将这两个库添加到项目的类路径中...

    java Web项目中过滤器使用方法

    在Java Web开发中,过滤器(Filter)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细讲解Java Web项目中过滤器的使用方法,以及如何配置和实现过滤器。 1. **过滤器的概念** 过滤器是...

    cors-filter-1.7.jar和java-property-utils-1.9.jar

    标题中的“cors-filter-1.7.jar”和“java-property-utils-1.9.jar”是两个Java库的JAR文件,它们在Java开发中扮演着重要角色,特别是对于Web应用程序。这里,我们将深入探讨这两个库的功能和它们在“jasperserver”...

    java 中如何使用filter过滤器

    在Java Web开发中,Filter(过滤器)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter...

    Tomcat解决跨域的两个jar包java-property-utils-1.9.jar和cors-filter-1.7.jar

    本篇将详细介绍如何利用java-property-utils-1.9.jar和cors-filter-1.7.jar这两个jar包解决Tomcat的跨域问题。 首先,让我们了解`java-property-utils-1.9.jar`。这个库是由Apache Commons项目提供的,主要用来处理...

    cors-filter-1.7.jar,java-property-utils-1.9.jar

    在这个场景中,我们关注的两个jar包——"cors-filter-1.7.jar"和"java-property-utils-1.9.jar"与Geoserver的安装以及CORS配置紧密相关。 首先,让我们了解Geoserver。Geoserver是一款开源的地理信息系统服务器,...

    JAVA web过滤器Filter学习资料

    第四,对相应的 servlet 和 JSP 页面注册过滤器,在部署描述符文件(web.xml)中使用 filter 和 filter-mapping 元素。最后,禁用激活器 servlet,防止用户利用缺省 servlet URL 绕过过滤器设置。 在建立过滤器时,...

    java web权限访问过滤器

    本教程将详细讲解如何使用Java Web中的过滤器(Filter)来实现这样的访问控制。过滤器是Servlet API的一部分,它允许我们在请求到达目标资源(如Servlet、JSP页面)之前或之后对请求和响应进行拦截处理。 首先,...

    cors-filter-1.7.jar java-util-1.9.1.jar

    "cors-filter-1.7.jar"是一个实现CORS过滤器的Java库,它帮助开发者在Java应用服务器上配置CORS策略,使得前端跨域请求能够顺利进行。这个库可能包含了一些预定义的过滤器类,用于处理HTTP请求头,如设置Access-...

    跨域、cors-filter-1.7、java-property-utils-1.9

    4. 在`web.xml`中配置CORS过滤器,指定配置文件的位置和过滤器的执行顺序。 5. 编写过滤器逻辑,使用解析的配置信息设置响应头。 以下是一个简单的`web.xml`配置示例: ```xml &lt;filter&gt; &lt;filter-name&gt;CORSFilter...

    java中文过滤器

    在Java Web开发中,"java中文过滤器"是一种常见的技术,用于处理B/S(Browser/Server)架构下中文字符编码的问题。在B/S系统中,数据通常通过HTTP协议在网络间传输,而HTTP协议默认并不规定字符编码,这可能导致在...

    Web后端开发-使用Filter过滤器技术,实现访问量统计-方法二使用web.xml配置的方式

    在Web后端开发中,Filter过滤器是一种非常重要的技术,它允许我们在请求被Servlet处理之前或之后进行拦截和处理。本篇文章将详细讲解如何通过使用`web.xml`配置文件来实现Filter过滤器,以实现对网站访问量的统计。...

    CORS包java-property-utils-1.9.jar和cors-filter-1.7-sources.jar

    `cors-filter-1.7` 版本可能是针对Tomcat或其他Java Web容器的一个自定义过滤器实现,用于支持ArcGIS Server的跨域请求。 ArcGIS Server 是Esri公司提供的一个强大的地理信息系统(GIS)服务平台,它可以部署在...

    java-property-utils-1.9.1.jar

    在实际使用中,`java-property-utils`库通常会在Servlet过滤器(Filter)中发挥作用。开发者可以创建一个实现了`javax.servlet.Filter`接口的类,并在`doFilter()`方法中调用库提供的API来设置响应头。当Web应用接收...

    过滤器在Java Web开发中的应用研究.pdf

    在深入分析和探讨过滤器在Java Web开发中的应用研究时,首先要了解过滤器的定义及其在Java Web开发中的重要作用。过滤器是一种设计模式,用于拦截请求和响应,以便执行某些预处理或后处理操作。在Java Web开发中,...

    JAVA WEB中的Servlet过滤器

    在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...

Global site tag (gtag.js) - Google Analytics