`

过滤器的工作方式

阅读更多
 从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持。过滤器能够对目标资源的请求和响应进行截取。过滤器的工作方式分为四种,下面让我们分别来看看这四种过滤器的工作方式:
1、request过滤器
    这种过滤器的工作方式比较简单,大家也经常遇到,如下图所示:

以下是web.xml文件配置方式:
<filter>
    
<filter-name>myFilter</filter-name>
    
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源一</servlet-name>
</filter-mapping>

下面我们更改一下web.xml文件的配置,如下方式:
<filter>
    
<filter-name>myFilter</filter-name>
    
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源一</servlet-name>
</filter-mapping>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源二</servlet-name>
</filter-mapping>

也就是说此过滤器对目标资源一和目标资源二进行过滤,然后当目标资源一被访问的时候我们将请求转发给目标资源二,那么这个时候过滤器是怎么工作的呢?如下图所示:

    我们可以看到,当我们访问目标资源一时过滤器截取了请求,然后再转发给目标资源一,然后再转发给目标资源二,从图中我们可以看到过滤器没有截取转发到目标资源二的请求,但是我们已经在web.xml文件中配置了该过滤器对目标资源二的过滤,为什么又没有起到过滤作用呢?

    答案就在于,目标资源一是客户端直接访问,而目标资源二是被转发过来的,这时过滤器就不能过滤目标资源二。如果你直接访问目标资源二,你会发现该过滤器起到了作用!
    我们上面的web.xml文件配置与以下方式等价:

<filter>myFilter</filter>
    
<filter-name>myFilter</filter-name>
    
<filter-class>xx.MyFilter</filte-class>
</filter>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源一</servlet-name>
  
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源二</servlet-name>
  
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理
    那如果我想对转发到目标资源二的请求进行过滤,那怎么办呢?答案见,下一种过滤器,forward过滤器


2、forward过滤器
   
我们将web.xml文件的配置修改如下:

<filter>myFilter</filter>
    
<filter-name>myFilter</filter-name>
    
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源一</servlet-name>
  
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源二</servlet-name>
  
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

工作方式如下图所示:
    我们看对目标资源二过滤的配置方式,这时过滤方式为forward,也就是说对转发到目标资源二的请求过滤,如果直接访问目标资源二,过滤器将不起作用。

3、include过滤器
    理解了forward过滤器之后,include过滤器就不难理解了。以下方式:

<filter-mapping>
  
<filter-name>myFilter</filter-name>
  
<servlet-name>目标资源二</servlet-name>
  
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>

 此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。
    include包含以下语句:
    在JSP页面中的动作:<jsp:include page=.......

    在Java代码中的request.getRequestDispatcher("....").include
    注意:如果目标资源一通过<%@ include file="目标资源二"%>指令包含,这时此过滤器不工作

4、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。

    如果我们访问一个已经存在的页面,会不会调用error.jsp呢?如果这个页面中有response.sendError(404,"出错了!");那么该错误页面仍然会被调用,过滤器也会工作。




々上善若水々 2007-11-26 23:59 发表评论
分享到:
评论

相关推荐

    java过滤器

    #### 多个过滤器工作方式 在一个应用中可能会有多个过滤器同时工作,它们之间通过过滤器链的方式协同工作。过滤器的执行顺序是由`web.xml`文件中的`&lt;filter-mapping&gt;`元素的排列顺序决定的。当一个请求经过过滤器链...

    Servlet过滤器的简单使用源码+文档

    2. `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`:这是过滤器的主要工作方法。`request`和`response`对象分别代表了HTTP请求和响应,`chain`对象则代表了过滤链。在调用`chain...

    过滤器(java编写的过滤器)

    通过对给定的过滤器配置进行深入解析,我们可以更好地理解过滤器的工作原理和配置方式,这对于实际项目开发具有重要的指导意义。在设计Web应用时,合理利用过滤器,可以有效提升应用的质量和效率。

    多介质过滤器设计规范

    过滤器的工作方式是压力式,使用三层滤料,包括锰砂、石英砂和无烟煤,这些材料具有良好的过滤截污能力和较高的过滤精度。 4. **滤料特点**:三层滤料的设计能有效去除多种污染物,具有大过滤截污能力、高过滤精度...

    web过滤器 c#

    在C#编程环境下,我们可以使用ASP.NET框架来实现Web过滤器,它对于构建安全、高效且可扩展的Web应用程序至关重要。 在ASP.NET中,过滤器主要分为四种类型:Action Filters、Authorization Filters、Exception ...

    过滤器(Filter)

    首先,我们需要理解过滤器的基本工作原理。当用户向服务器发送一个请求时,过滤器会按照在web.xml中的配置顺序被调用。每个过滤器都可以对请求和响应进行预处理和后处理。如果过滤器选择允许请求通过,它会调用下一...

    JAVA Web中过滤器

    从Java Servlet 3.0版本开始,我们还可以使用注解的方式来配置过滤器,无需在web.xml中手动配置,使得代码更加简洁。 通过了解和熟练运用JAVA Web中的过滤器,开发者可以更高效地管理和控制Web应用的输入和输出,...

    过滤器链的一个小Demo

    这个例子可以帮助我们理解过滤器链的执行顺序和协作方式。在实际开发中,我们可以通过调整过滤器的配置顺序,实现不同的功能组合,例如先进行身份验证,再进行数据校验,最后进行日志记录。同时,过滤器还可以结合...

    servlet过滤器详解

    通过这种方式,过滤器能够有效地拦截和修改请求或响应的信息。 - **过滤器的作用**: - **拦截请求**:在请求到达Servlet之前,过滤器可以对其进行拦截,从而实现对请求内容的检查或修改。 - **修改请求**:过滤...

    网络编程 过滤器链例子

    总之,过滤器链是Java Web开发中的重要工具,它提供了一种灵活的方式来增强应用程序的功能,而无需修改目标资源的代码。通过理解并熟练运用过滤器链,开发者可以更高效地管理和维护复杂的Web应用程序。本例中的"过滤...

    基于servlet的过滤器

    首先,我们要理解Servlet过滤器的工作原理。根据Java Servlet规范,过滤器(Filter)是通过实现`javax.servlet.Filter`接口来创建的。这个接口定义了三个关键方法:`init()`, `doFilter()`, 和 `destroy()`。`init()...

    过滤器Filter的全面解析

    本文将全面解析过滤器的概念、原理及其实现方式。 过滤器是Java Servlet规范的一部分,从Servlet 2.3版本开始引入。其主要工作原理是基于拦截器模式,通过在请求到达目标资源(如Servlet或JSP)之前和之后插入代码...

    拦截过滤器模式

    以下是一个具体的实现示例,通过创建各个组件来展示拦截过滤器模式的工作原理。 ##### 步骤1: 创建过滤器接口 `Filter` ```java public interface Filter { public void execute(String request); } ``` 此接口...

    过滤器详细讲解及代码

    过滤器的初始化方法`init(FilterConfig config)`允许设置一些初始参数,如编码方式。在示例代码中,`targetEncoding`变量被用来存储从`FilterConfig`对象获取的编码参数,这在后续处理中用于设置请求和响应的字符...

    过滤器的部分知识

    在这个主题中,我们将深入探讨过滤器与Servlet的协同工作方式。 首先,让我们理解过滤器的基本工作原理。过滤器可以看作是一个“中间人”,它在客户端和服务器之间处理请求和响应。当用户发起一个HTTP请求时,过滤...

    微过滤器开发指南文档

    原始文档《Filter Driver Development Guide》可在微软官方网站获取,对于理解微过滤器的工作方式和接口至关重要。 总的来说,微过滤器驱动开发是Windows系统中实现定制文件系统行为的关键途径,通过使用微软提供的...

    jsp中的过滤器(含例子)

    本篇将深入讲解`JSP`中的过滤器,并通过实例来帮助理解其工作原理和应用场景。 首先,我们需要了解`Filter`的基本概念。过滤器是一个实现了`javax.servlet.Filter`接口的类,它可以拦截HTTP请求并进行预处理,或者...

    flume过滤器

    首先,过滤器的工作机制如下: 1. 数据捕获:过滤器首先捕获从Source接收到的事件(Event)。 2. 解析数据:过滤器解析事件中的数据内容,这些数据通常是日志记录或其他类型的数据。 3. 规则匹配:根据配置的过滤...

    servlet过滤器技术实例,

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者Servlet...在学习和使用servlet过滤器时,理解其工作原理和生命周期,以及如何在`web.xml`或Spring框架中配置,都是非常关键的。

Global site tag (gtag.js) - Google Analytics