Servlet Filter 又称 Servlet 过滤器,它是在 Servlet 2.3 规范中定义的,能够对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查修改

Filter 不是 Servlet,不能直接访问,它本身也不能生成 request 对象和 response 对象,它只能为 Web 资源提供以下过滤功能:

  • 在 Web 资源被访问前,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  • 将请求传递到下一个过滤器或目标资源。
  • 在 Web 资源被访问后,检查 response 对象,修改响应头和响应正文。

注意:过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发或重定向到其他的 Web 资源。

Filter 是 Servlet 规范中最实用的技术,通过它可以对服务器管理的所有 Web 资源(例如 JSP、Servlet、静态 HTML 文件、静态图片等)进行拦截,从而实现一些特殊的功能,例如用户的权限控制、过滤敏感词、设置统一编码格式等。

Filter 接口

与开发 Servlet 需要实现 javax.servlet.Servlet 接口类似,开发过滤器要实现 javax.servlet.Filter 接口,并提供一个公开的不带参的构造方法。在 Filter 接口中,定义了 3 个方法,如下表所示。

返回值类型 方法 功能描述
void init (FilterConfig filterConfig) 该方法用于初始化过滤器。
void doFilter(ServletRequest request,SeivletResponse response, FilterChain chain) 该方法完成实际的过滤操作,当客户端请求的 URL 与过滤器映射的 URL 匹配时,容器会先调用该方法对请求进行拦截。
参数 request 和 response 表示请求和响应对象。
参数 chain 代表当前 Filter 链对象,在该方法内部,调用 chain.doFilter() 方法,才能把请求交付给 Filter 链中的下一个 Filter 或者 Web 资源。
void destroy() 该方法在销毁 Filter 对象之前被调用,用于释放被 Filter 对象占用的资源。 

Filter 的工作流程

  1. 客户端请求访问容器内的 Web 资源。
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
  6. 响应信息返回客户端。

Filter 的生命周期

Filter 的生命周期分为 3 个阶段:

  1. 初始化阶段
  2. 拦截和过滤阶段
  3. 销毁阶段

1. 初始化阶段

Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。

加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。

2. 拦截和过滤阶段

该阶段是 Filter 生命周期中最重要的阶段。当客户端请求访问 Web 资源时,Servlet 容器会根据 web.xml 或 @WebFilter 的过滤规则进行检查。当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。

3. 销毁阶段

Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。在 Filter 的生命周期内,destory() 只执行一次。

Servlet过滤器Filter相关推荐

  1. Java web—Servlet过滤器(Filter)

    前言:         过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...

  2. Servlet过滤器Filter和监听器

    一.Servlet过滤器的概念: *********************************************************************************** ...

  3. Java学习路线-49:Servlet过滤器Filter

    课时1 过滤器的入门 JavaWeb三大组件 1.都需要在web.xml中进行配置 Servlet Filter Listener 2.过滤器 会在一组资源(jsp, servlet, css, ht ...

  4. java过滤器应用实例_Servlet过滤器Filter的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Servlet过滤器Filter的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 特点 1)Filter是依赖于Servlet容器,属 ...

  5. SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener

    SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener 1.定义组件的配置类: com.example.mybatis2018.config.MyServletCo ...

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

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

  7. 文章本天成|跟我一起来一场简洁易懂的servlet的过滤器Filter的学习吧

    filter的前身今生 0.fiter是什么 1.filter有啥用 2.filter在哪里 3.filter做了啥 4.filter代码实现 4.1 依赖包 4.2 代码 4.2.1 MyFirst ...

  8. Servlet 3.0 @WebFilter注解过滤器Filter使用(如何设置多个参数的方法)

    因为在网上搜寻半天发现没有关于@WebFilter注解如何设置多个参数的方法,参考其他博主的文章和自己的实践,写下此笔记,供大家参考 Servlet3.0提供@WebFilter注解将一个实现了jav ...

  9. Servlet过滤器(Filter)不过滤登录页面、JS和CSS文件

    Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,先将过滤后的请求转交给下一资源,它在Java Web开发中具有十分重要的作用.Servlet过滤器可以用于验证用户的登录情况,但在实际 ...

最新文章

  1. mysql5.5安装
  2. 远程桌面中Tab键不能补全的解决办法
  3. 每秒上万并发下的Spring Cloud参数优化实战
  4. Statement和PreparedStatement深入学习总结
  5. jna 使用_使用JNA的透明JFrame
  6. java 窗体 源码_Java制作MDI窗体源代码
  7. 数据库-Linux系统下的命令
  8. webdriver 等待页面加载完成_Python爬虫,登陆神器Selenium等待(waits)页面加载的三种方法...
  9. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
  10. CorelDRAWX4的VBA插件开发(三)VBA的必用基础知识
  11. dell服务器开机蓝屏无限重启,戴尔电脑不停蓝屏重启怎么办
  12. python输出列表的子列表_python切片(获取一个子列表(数组))详解
  13. 《Adobe Premiere Pro CS6中文版经典教程》——复习题
  14. SpringMVC总结笔记
  15. 内分泌6项检查费用_内分泌6项检查费用是多少 详解内分泌6项检查是什么
  16. Rust学习笔记(13)——struct、Option和Box组合应用实现单向链表
  17. 2020行业进阶趋势:传统IT式微已显而易见
  18. 芬兰ZYFRA公司在首届中俄创新大赛中获胜
  19. 复选框CheckBox
  20. 组件化设计思维 – 从规范到工具的构建与探索

热门文章

  1. 程序员30岁投简历找工作,还能找到满意的工作吗?
  2. (转)智能投顾万亿级市场模式待定 银、券、基三派都怎么玩?
  3. 《趣谈Linux》总结三:进程/线程
  4. 【解决方案】在windows系统中解决刻录光驱没法刻录光盘的问题
  5. 何恺明霸榜,近10年里的具有影响力的一作(年轻)AI学者大盘点
  6. java map类说_在Java中,关于HashMap类的描述,以下说法错误的是(   )。
  7. 黄仁勋台大毕典演说全文
  8. python实践之电商系列
  9. 图灵最强诸葛老师最新分享:分布式服务框架原理与实践.pdf篇
  10. [Unity3D]接入vive tracker 方案SteamVR+VRTK配置