`

Tomcat 7源码学习笔记 -8 Filter过滤器解读

阅读更多
1.过滤器的主要功能是允许我们在request转给某个资源之前(比如:html文件,servlet,JSP文件,图片文件,excel文件等等)做一些事情,然后在response返回给客户端之前做一些事情。功能上有些类似于防火墙,对入口和出口进行严格控制。


public class MyFilter implements Filter {

//tomcat启动,或者context重新加载的时候调用init(先destroy再init)
public void init(FilterConfig filterConfig) throws ServletException {
  System.out.println("MyFilter init...");
}

public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  //request到达的时候执行下面的代码
  System.out.println("MyFilter request>>>>>>>>>>>>");
  
  //转给过滤器链中的下一个filter,如果是最后一个filter,调用要访问的资源
  chain.doFilter(request,response);
  
  //要访问的资源访问完以后,response到达的时候执行下面的代码
  System.out.println("MyFilter response>>>>>>>>>>>>");
}
//tomcat关闭或者context重新加载的时候调用destroy
public void destroy() { 
  System.out.println("MyFilter destroy...");
}

}


2.filter的配置方法

web.xml

通过url匹配:

<filter>
    <filter-name>My Filter</filter-name>
    <filter-class>MyFilter</filter-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>My Filter</filter-name>
<!-- url匹配规则 -->
    <url-pattern>/*</url-pattern>  
<!-- filter对应的请求方式,默认是REQUEST -->
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>


通过servlet名匹配:

<filter>
    <filter-name>My Filter</filter-name>
    <filter-class>MyFilter</filter-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>My Filter</filter-name>
<!-- 根据url匹配到MyServlet的时候,执行My Filter -->
    <servlet-name>MyServlet</servlet-name>  
<!-- filter对应的请求方式,默认是REQUEST -->
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>


3.过滤器链
1)request到达以后,实际匹配到的过滤器可能有一个,也可能有多个,多个的时候,会形成一个过滤器链,过滤器的执行顺序和web.xml中filter-mapping的配置的先后顺序一致,写在前面的先执行,写在后面的后执行。

2)每个过滤器执行完以后会调用chain.doFilter(request,response);从而调用下一个过滤器的doFilter方法。(其实此时执行到的只是每个过滤器中chain.doFilter(request,response);之前的代码)

3)当所有的匹配到的过滤器都执行完以后,将调用具体访问的资源,比如servlet,或者jsp。

4)请求的资源执行结束后,response返回的时候,再次调用匹配到的过滤器。调用顺序和request到达时的调用顺序正好相反。(此时执行的是每个过滤器中chain.doFilter(request,response);之后的代码)

如果在过滤器的doFilter前后,以及访问的servlet的doGet中事先写入打印调试信息的话,在浏览器中提交某个get请求的话,在控制台会看到下面的打印信息:

MyFilter1 request>>>>>>>>>>>>
MyFilter2 request>>>>>>>>>>>>
MyFilter3 request>>>>>>>>>>>>
MyServlet doGet>>>>>>>>>>>>
MyFilter3 response>>>>>>>>>>>>
MyFilter2 response>>>>>>>>>>>>
MyFilter1 response>>>>>>>>>>>>

对应的调用顺序如下:
客户端发出request --> MyFilter1 --> MyFilter2 --> MyFilter3 --> MyServlet --> MyFilter3 --> MyFilter2 --> MyFilter1
--> 客户端获得response
分享到:
评论

相关推荐

    Tomcat 源代码调试笔记 - 看不见的 Shell1

    通过对这个方法的细节与自定义插入过滤器的细节进行比较,作者找到了一个能在Tomcat 8(Tomcat 7可能需要稍作修改)下实现动态插入过滤器的方法。 5. **示例代码**: 笔记中提供了一个JSP文件的示例,展示了如何...

    Filter过滤器笔记1

    **Filter过滤器详解** 在Java Web开发中,Filter过滤器是一种强大的工具,它属于JavaEE规范中的重要组成部分,与Servlet程序、Listener监听器并称为三大组件。Filter的主要职责是拦截客户端的请求和服务器的响应,...

    javaweb 学习笔记

    - 设置过滤器: `&lt;filter&gt;&lt;filter-name&gt;MyFilter&lt;/filter-name&gt;&lt;filter-class&gt;com.example.MyFilter&lt;/filter-class&gt;&lt;/filter&gt;&lt;filter-mapping&gt;&lt;filter-name&gt;MyFilter&lt;/filter-name&gt;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;&lt;/...

    一些javaweb源码和笔记

    除此之外,过滤器(Filter)和监听器(Listener)也是JavaWeb的重要组件。过滤器可以对HTTP请求和响应进行拦截,实现如登录检查、字符编码转换等功能。监听器则用于监听Web应用中的特定事件,例如会话创建或销毁,...

    day04-Tomcat&Servlet入门-讲义.zip

    11. **过滤器和监听器**:Servlet API中的高级特性,如`Filter`可以预处理请求和后处理响应,`Listener`可以监听特定事件,如会话创建、销毁等。 通过这份"day04-Tomcat&Servlet入门-讲义.zip"的学习,初学者将建立...

    struts2学习笔记(1)

    ### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...

    JSP Servlet 学习笔记源码

    6. **过滤器(Filter)和监听器(Listener)**: 过滤器在Servlet容器中拦截请求和响应,可以进行预处理和后处理,比如登录验证、字符编码转换等。监听器则监听特定事件,如会话创建、销毁,ServletContext的改变等...

    JavaWeb图书管理系统视频+资料+笔记-JavaWeb-bookEstore.rar

    7. **Filter过滤器**:JavaWeb中的过滤器可以拦截请求和响应,实现权限控制、日志记录等功能。 8. **Servlet生命周期**:包括加载、实例化、初始化、服务、销毁五个阶段,理解其生命周期对于优化性能和资源管理至关...

    struts2学习笔记.doc

    - 添加`FilterDispatcher`过滤器配置: ```xml &lt;filter&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; ...

    Eclipse宝典--读书笔记

    - **Filter Mapping**: 映射过滤器到所有请求。 - **Url Pattern**: `/*` #### 三、总结 通过上述内容的学习,我们可以了解到如何配置Eclipse及其周边工具如JDK、Tomcat和MyEclipse等的环境变量。同时,也介绍了...

    黑马程序员_超全面的JavaWeb教程-视频+源码笔记

    ### 黑马程序员_超全面的JavaWeb教程-视频+源码笔记 #### JavaWeb基础知识概览 在深入了解本教程之前,我们先来简要回顾一下JavaWeb的基础知识。JavaWeb是利用Java语言开发Web应用的技术集合。它主要包括Servlet、...

    Servlet&JSP;学习笔记源代码

    8. **过滤器(Filter)**:如何定义和使用Filter,实现请求的预处理和后处理,比如登录检查、字符编码转换等。 9. **监听器(Listener)**:利用ServletContextListener、ServletRequestListener、...

    SSH框架整合笔记

    该文件是Web应用的核心配置文件之一,用于配置Servlet容器的初始化参数、监听器、过滤器等。 ##### 2. 导入依赖包 - **所需JAR包**: - Struts2核心库(例如:`struts2-core-2.2.24.jar`) - Tomcat相关的JAR包...

    MLDN——Java Web 开发实战经典源码笔记(基础篇)|

    6. **过滤器和监听器**:介绍Filter接口和Listener接口的使用,它们可以用于拦截请求、响应,以及监听应用程序的特定事件。 7. **会话管理**:讲解如何在Web应用中管理和跟踪用户会话,包括Cookie和Session的使用。...

    struts2.0学习笔记

    配置`web.xml`文件,设置Struts2的过滤器,以便拦截所有请求: ```xml &lt;filter&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt; &lt;/filter&gt; ...

    传智的javaweb学习笔记,比较全的

    7. **过滤器(Filter)和监听器(Listener)**:这两者是JavaWeb中增强应用程序功能的重要组件,笔记可能讲解了如何配置和使用它们。 8. **文件上传和下载**:在Web应用中,文件操作是常见需求,笔记会涵盖Servlet...

    java web学习笔记

    5. **Filter(过滤器)和Listener(监听器)**:这两种技术用于增强Web应用的功能。Filter可以拦截请求和响应,实现如权限控制、日志记录等功能。Listener则监听Web应用中的特定事件,如session的创建、销毁,或者...

    JAVA WEB学习笔记

    【JAVA WEB学习笔记】 Java Web是Java技术在Web开发领域中的应用,涵盖了从服务器端编程到客户端交互的各种技术。这份学习笔记将带你深入理解Java Web的核心概念和实践技巧。 1. **Servlet与JSP** - Servlet是...

    传智播客崔希凡javaweb笔记完整版

    接下来,笔记可能深入到过滤器(Filter)和监听器(Listener)的概念。过滤器可以拦截请求和响应,执行预处理或后处理操作,如字符编码转换、安全检查等。常见的过滤器接口有Filter和ServletChain。监听器则能监听...

Global site tag (gtag.js) - Google Analytics