目录

FilterChain 接口

Filter 链的拦截过程

Filter 链中 Filter 的执行顺序

示例


在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。

FilterChain 接口

javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象作为参数传入 Filter 对象的 doFilter() 方法中。Filter 对象可以使用 FilterChain 对象调用链中下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。FilterChain 接口中只有一个方法,如下表。

返回值类型 方法 描述
void doFilter(ServletRequest request ,ServletResponse response) 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。

在 Filter.doFilter() 方法中调用 FilterChain.doFilter() 方法的语句前后增加某些程序代码,就可以在 Servlet 进行响应前后实现某些特殊功能,例如权限控制、过滤敏感词、设置统一编码格式等。

Filter 链的拦截过程

Filter 链的拦截过程如下图所示。

请求资源时,过滤器链中的过滤器依次对请求进行处理,并将请求传递给下一个过滤器,直到最后将请求传递给目标资源。发送响应信息时,则按照相反的顺序对响应进行处理,直到将响应返回给客户端。

过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发给其他的目标资源。// 可以直接返回资源,不再往后传递

注:过滤器链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源。

Filter 链中 Filter 的执行顺序

通过 web.xml 配置的 Filter 过滤器,执行顺序由 <filter-mapping> 标签的配置顺序决定。<filter-mapping> 靠前,则 Filter 先执行,靠后则后执行。通过修改 <filter-mapping> 的顺序便可以修改 Filter 的执行顺序。

通过 @WebFilter 注解配置的 Filter 过滤器,无法进行排序,若需要对 Filter 过滤器进行排序,建议使用 web.xml 进行配置。// 但如果需要,修改filter目录中对应过滤器的文件名按首字母顺序调整自己想要的顺序即可!!!

示例

创建名称为 LoginServlet 的类,代码如下。

package swadian.servlet.filter;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author swadian* @date 2022/2/14* @Version 1.0*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;public LoginServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {//设置向页面输出的格式与编码response.getWriter().write("<h3>LoginServlet 欢迎您 !</h3>");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {doGet(request, response);}
}

创建名称为 FirstChainFilter 的类,代码如下。

package swadian.servlet.filter;import javax.servlet.DispatcherType;
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.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;/*** @author swadian* @date 2022/2/14* @Version 1.0*/
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE,DispatcherType.ERROR
},urlPatterns = {"/LoginServlet"})
public class FirstChainFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//设置向页面输出的格式与编码response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("FirstChainFilter 对请求进行处理<br/>");chain.doFilter(request, response);writer.write("FirstChainFilter 对响应进行处理<br/>");}@Overridepublic void destroy() {}
}

创建名称为 SecondChainFilter 的类,代码如下。

package swadian.servlet.filter;import javax.servlet.DispatcherType;
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.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;/*** @author swadian* @date 2022/2/15* @Version 1.0*/
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE,DispatcherType.ERROR
},urlPatterns = {"/LoginServlet"})
public class SecondChainFilter implements Filter {public SecondChainFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//设置向页面输出的格式与编码response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("SecondChainFilter 对请求进行处理<br/>");chain.doFilter(request, response);writer.write("SecondChainFilter 对响应进行处理<br/>");}public void init(FilterConfig fConfig) {}
}

启动 Tomcat 服务器,在浏览器地址栏中输入“http://localhost:8080/web/LoginServlet”,结果如下。

附:web.xml 中配置过滤器方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!--过滤器链中FirstChainFilter配置 --><filter><filter-name>FirstChainFilter</filter-name><filter-class>swadian.servlet.filter.FirstChainFilter</filter-class></filter><filter-mapping><filter-name>FirstChainFilter</filter-name><url-pattern>/LoginServlet</url-pattern></filter-mapping><!--过滤器链中SecondChainFilter配置 --><filter><filter-name>SecondChainFilter</filter-name><filter-class>swadian.servlet.filter.SecondChainFilter</filter-class></filter><filter-mapping><filter-name>SecondChainFilter</filter-name><url-pattern>/LoginServlet</url-pattern></filter-mapping>
</web-app>

FilterChain 过滤器链(Servlet)...修改中...相关推荐

  1. Filter过滤器的这些内容(Filter的生命周期FilterChain过滤器链Filter的拦截路径...),你都理解了吗?

         说说Filter(过滤器),它是javaWeb的三大组件之一,三大组件包括Servlet,Filter,Listener.Servlet前面已经详细说过了,这篇说的是Filter,关于Lis ...

  2. FilterConfig类及FilterChain过滤器链

    FilterConfig是Filter的配置文件类 Tomcat 每次创建Filter类的时候同时会创建一个FilterConfig类 包含了Filter配置文件的配置信息 FilterConfig类 ...

  3. FilterChain 过滤器链和拦截路径

    Filter 过滤器 Chain 链,链条 FilterChain 就是过滤器链(多个过滤器如何一起工作) Filter 的拦截路径 精确匹配: <url-pattern>/target. ...

  4. Java培训总结:过滤器链的实现方法、配置和案例分析

    今天小千给大家分享的是Java培训总结:过滤器链的实现方法.配置和案例分析. 过滤器能够对网站中的各种内容进行过滤(页面.Servlet.图片.文件),可以在网站内容请求和响应时进行一些操作,完成一些 ...

  5. FilterChain(过滤器链)详解

    在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截.如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter ...

  6. Servlet规范中定义的过滤器

    文章目录 什么是过滤器 写过滤器的步骤 配置初始化参数 过滤器的优先级 过滤器的优点 过滤器执行过程图解 过滤敏感词的示例代码 使用 Servlet 来过滤敏感词 使用过滤器来过滤敏感词 通过配置初始 ...

  7. java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解

    ***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...

  8. java filter 调用链_JavaWeb开发Servlet过滤器链执行顺序详解

    ***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...

  9. Servlet→对象监听器、事件监听器、Session钝化活化、@WebListener标注、过滤器概念原理生命周期、过滤器链、@WebFilter标注、定时器Timer、cancel()、purge

    监听器ServletContextListener HttpSessionListener ServletRequestListener 事件监听器 Session钝化活化 @WebListener标 ...

最新文章

  1. 将前500页,和中间500页的CVE编号放在一起
  2. php获取图高度,PHP imagesx()、imagesy() – 获取图像宽度与高度_程序员人生
  3. 20181204-1 每周例行报告
  4. 关于地理信息系统(GIS)的几个问题
  5. oracle定时任务(dbms_job)
  6. 3d vision可以卸载吗_金属粉末可以用于3D打印,但这些知识你了解吗?
  7. codeforces1552 D. Array Differentiation(思维+暴力)
  8. 使用webService时,gsoap数据类型注意事项
  9. java中子类实例化过程中的内存分配
  10. 4个你未必知道的内存小知识
  11. 20款最优秀的JavaScript编辑器
  12. css实现文本溢出时显示省略号(单行)
  13. 路由期末复习(二)—配置命令
  14. ubuntu16.04,exFAT格式U盘无法打开,离线解决方式
  15. 用户画像业务数据调研及ETL(二)持续更新中...
  16. [CSS] css使用first-child 和last-child 实现三条杠效果
  17. 腾讯可信区块链方案白皮书 QA
  18. 常用逻辑用语知识点【初级和中阶辅导】
  19. delta method 介绍
  20. java获取枚举索引_Java枚举使用详解

热门文章

  1. iphone11pro市场价_iPhone11 Pro首发真机体验:花这一万元真的值吗?
  2. 程序员发朋友圈的七种范式
  3. MATLAB 将 n 美分转换成 25、10、5 和 1 美分的硬币总共有多少种转换方法?编写一个函数,传入参数 n,输出转换的种类
  4. mysql分区表truncate分区数据_详解MySQL分区表
  5. tell网关arp包正常吗_网工知识角|如何理解ARP协议?防护有诀窍,网络工程师必读...
  6. [Mysql] 更新数据
  7. tmux命令基本使用
  8. 我的世界服务器自动跳跃,《我的世界》学会2条跳跃指令 加速度超越火箭 轻轻一跳越过256...
  9. 智能家居物联网服务平台设计-论文
  10. 百度 WebUploader 分片上传