概述

Filter是Servlet规范中的过滤器,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

生命周期

  1. 在应用启动的时候就进行装载Filter类而servlet是在请求时才创建(但filter与Servlet的load-on-startup配置效果相同)。对于部署描述符中声明的每一个过滤器,只创建一个实例,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此开发过滤器时也要考虑线程安全的问题。

  2. 容器创建好Filter对象实例后,调用init方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

  3. 当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。

  4. 当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

配置

Filter也是在web.xml中一个常用的配置项,可以通过如下进行配置:

<filter>  <filter-name>sensitiveFilter</filter-name>  <filter-class>com.biezhi.SensitiveFilter</filter-class>
</filter>
<filter-mapping>  <filter-name>sensitiveFilter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>
package com.biezhi.filter;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/** 敏感词汇过滤*/
public class SensitiveFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 转换成实例的请求和响应对象HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;// 获取评论并屏蔽关键字String str = req.getParameter("str");str = str.replace("被就业", "***");// 重新设置参数req.setAttribute("str", str);// 继续执行chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException{}@Overridepublic void destroy(){}
}

实际上Filter可以完成Servlet同样的工作,甚至比Servlet更加灵活,因为它除了提供了request和response对象
外,还提供了一个FilterChain对象,这个对象可以让我们更加灵活的控制请求的流转。

执行流程

在Tomcat容器中,FilterConfig和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,Filter是一个接口,由用户自己实现,只要实现Filter接口的三个方法即可,这三个方法和Servlet中的类似。只不过还有一个ApplicationFilterChain类,这个类可以将多个Filter串联起来,组成一个链,这个链与jetty中的Handler链有异曲同工之妙,下面是Filter接口中的三个方法:

  • init(FilterConfig)
    初始化方法,在用户自定义的Filter初始化时被调用,它与Servlet的init方法作用相同,FilterConfig与ServletConfig也类似,除了都能获取到容器的上下文(Context)之外,还可以获取Filter在初始化时设置的<init-param>参数值。

  • doFilter(SerlvetRequest, ServletResponse, FilterChain)
    每个请求进来的时候这个方法都会被调用,并在Servlet的service方法执行之前。而FilterChain就代表当前的整个请求链,所以通过调用FilterChain的doFilter方法可以继续将请求传递下去。如果想拦截这个请求,可以不调用FilterChain的doFilter,那么这个请求就返回了,所以Filter是一种责任链模式。

  • destory
    当Filter被销毁的时候调用该方法。注意,当web容器调用这个方法的时候,会再调用一次doFilter方法。

Filter类的核心还是doFilter中传递的FilterChain对象,这个对象保存了到最终的Servlet对象的所有Filter对象,这些对象都保存在ApplicationFilterChain对象的filter数组中。在FilterChain链上每执行一个Filter对象,数组的当前计数都会加1,直到计数等于数组的长度,当FilterChain上的所有Filter对象都执行完之后,就会执行最终的Servlet。所以在ApplicationFilterChain对象中会持有Servlet对象的引用。

Servlet规范之Filter工作原理相关推荐

  1. Servlet规范之Listener工作原理

    监听器原理: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 简单的说,被监听对象A中 ...

  2. java过滤器的原理_Java 三大器之过滤器(Filter)工作原理

    Filter 简介 filter称为过滤器,可以对web 服务器管理的所有资源: Jsp, Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访 ...

  3. Javaweb核心之servlet规范过滤器-----Filter

    2 Servlet规范中的过滤器-Filter 2.1 过滤器入门 2.1.1 过滤器概念及作用 过滤器--Filter,它是JavaWeb三大组件之一.另外两个是Servlet和Listener. ...

  4. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  5. Servlet 生命周期、工作原理

    摘自:http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.htm Servllet 生命周期:Servlet 加载--->实例化-- ...

  6. Tomcat对Servlet规范的Filter及Listener实现

    加载Servlet的类不等于创建Servlet实例,Tomcat先加载Servlet的类,然后还得在Java堆创建Servlet实例. 一个Web应用里往往有多个Servlet,而在Tomcat中一个 ...

  7. Servlet快速入门和工作原理

    Servlet:  server applet     * 概念:运行在服务器端的小程序         * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则.   ...

  8. Filter过滤器的生命周期和工作原理

    一.Filter是什么? Filter:过滤器,它需要实现javax.servlet.Filter接口.Filter是过滤器,与拦截器不同.过滤器是先于与之相关的Servlet和JSP运行在服务器上. ...

  9. Filter过滤器工作原理

    Filter过滤器工作原理 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Js ...

最新文章

  1. 用C语言解“求整数段和”题
  2. 互联网协议入门(二)【转】
  3. shell中字符串基本用法
  4. 《代码大全2》读书笔记(七)
  5. Android Studio apk 打包流程
  6. 缓存装饰器的应用习题练习
  7. python 路径拼接字符串_字符串游戏之拼接字符串
  8. java增删改查控制台_在控制台中输入增删改查 (初学者)
  9. 感知器算法超详细讲解实战【原理+手撸代码实现】+spark应用实践
  10. Finaldata数据恢复软件官方版
  11. 谈谈人们常说的“一时糊涂,鬼迷心窍”!
  12. php amr mp3,php实现微信语音amr文件在线播放方法
  13. 专家调查显示:液晶电视坏眼超等离子电视
  14. IPv4/IPv6、DHCP、网关、路由
  15. ps2021直装版|ps2021中文直装版 v22.0.0.35附安装教程
  16. Tensorflow应用之LSTM
  17. 【产品设计】有了创意,如何从零开始搭建一套产品模型
  18. 上班迟到致失业,罪魁祸首在于这个 App 的 Bug!
  19. 网站上线要做的事和不该做的事,你知道吗?
  20. pytorch手写VGG16网络,两种写法,低阶基础写法

热门文章

  1. 分析rss/xml结构附带源码【原创】
  2. linux ssh和sftp区别,Linux SSH和SFTP配置
  3. 如何做一个国产数据库(七) 网络传输 java做订阅客户端
  4. chrome 无法抓屏的问题
  5. mysql pre_commit_Git — Pre-commit钩子的使用
  6. 业务逻辑全写在sql_12306的业务逻辑很复杂么?一条SQL语句搞不定?
  7. u-boot移植随笔:u-boot shell与ASCII码
  8. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
  9. ajxs跨域 php_PHP Ajax 跨域问题最佳解决方案
  10. 【Flink】This YARN version does not support getSchedulerResourceTypes