多个Filter的执行顺序 | 职责链模式应用

news/2024/10/31 3:20:59/

文章目录

  • 前言
  • 一、多个Filter的执行顺序
    • 1. 配置web.xml方式注册Filter
      • 结论:
    • 2. 注解方式注册Filter
      • 结论:
  • 二、职责链模式的应用
    • 1. 回顾职责链模式
    • 2. Filter职责链模式的应用
  • 总结

前言

  Filter(过滤器) 是 Java Servlet 规范中定义的一种组件,用于在请求到达 Servlet 之前或响应返回给客户端之前对请求和响应进行处理。Filter 的主要作用是拦截、修改或处理传入的请求和传出的响应。

  tomcat作为web容器,提供了对 Filter 的支持。Tomcat 开启了Filter 的生命周期,当请求到达 Tomcat 时,Tomcat 将根据配置的 Filter 映射将请求传递给相应的 Filter。

  Filter 可以设置多个,并且按照一定顺序依次执行,这是因为使用了设计模式中的职责链模式。



一、多个Filter的执行顺序

1. 配置web.xml方式注册Filter

  自定义过滤器:

public class FilterOne implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器1执行——————————————————————————————————————");chain.doFilter(request,response);}
}
public class FilterTwo implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器2执行——————————————————————————————————————");chain.doFilter(request,response);}
}
public class FilterThree implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器3执行——————————————————————————————————————");chain.doFilter(request,response);}
}

  配置 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--注册SpringMVC的前端控制器——DispatcherServlet--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--关联配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--启动级别1--><load-on-startup>1</load-on-startup></servlet><!--/ 匹配所有请求,不包括jsp--><!--/* 匹配所有请求,包括jsp--><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--配置过滤器FilterOne、FilterTwo、FilterThree--><filter><filter-name>FilterThree</filter-name><filter-class>com.config.FilterThree</filter-class></filter><filter-mapping><filter-name>FilterThree</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>FilterOne</filter-name><filter-class>com.config.FilterOne</filter-class></filter><filter-mapping><filter-name>FilterOne</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>FilterTwo</filter-name><filter-class>com.config.FilterTwo</filter-class></filter><filter-mapping><filter-name>FilterTwo</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

结论:

  进入调试模式,可以看到过滤器统一放在一个容器中,顺序就是web.xml中从上到下的设置顺序。
在这里插入图片描述

  最后出来的打印执行顺序如下:按照解析web.xml的顺序添加的过滤器,并按照添加顺序执行的。
请添加图片描述



2. 注解方式注册Filter

  自定义过滤器:

@WebFilter(filterName = "FilterOne", urlPatterns = {"/*"})
public class FilterOne implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器1执行——————————————————————————————————————");chain.doFilter(request,response);}
}
@WebFilter(filterName = "FilterThree", urlPatterns = {"/*"})
public class FilterThree implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器3执行——————————————————————————————————————");chain.doFilter(request,response);}
}
@WebFilter(filterName = "FilterTwo", urlPatterns = {"/*"})
public class FilterTwo implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器2执行——————————————————————————————————————");chain.doFilter(request,response);}
}

结论:

  最后出来的打印执行顺序如下:
在这里插入图片描述


   根据类名的字母顺序排序,也就是说按字母顺序添加的过滤器,并且也按添加顺序执行的。
在这里插入图片描述



二、职责链模式的应用

1. 回顾职责链模式

  先来回顾职责链模式的特点:职责链模式——向上级申请加薪
  职责链模式特点如下:

  • 分离发送者和接收者:将发送者和接收者解耦,发送者只需要将请求发送给职责链的起始节点,而不需要知道具体的接收者。接收者也不需要知道请求的发送者是谁。

  • 多个处理节点处理请求:请求会在职责链上的多个处理节点中依次传递,每个节点都有机会处理请求。这样可以将复杂的处理逻辑分解成多个独立的节点。

  • 请求的处理可以终止:每个处理节点都可以决定是否继续传递请求给下一个节点或终止处理。这样可以灵活地控制请求的处理流程。

在这里插入图片描述

2. Filter职责链模式的应用

  所有过滤器都实现了doFilter方法,但是没有设置下级链的方法。
在这里插入图片描述
  Tomcat包中的ApplicationFilterFactory类中有个createFilterChain()方法,它的主要作用是将一组 Filters 以特定的顺序组合成一个 FilterChain,自动设置好了每一链的下级链。

  FilterChain 将被用于处理传入的请求,按照预定的顺序调用相应的 Filters 和最终的 Servlet(请求的方法)。
  例如:
在这里插入图片描述


  createFilterChain()方法大致的工作内容:

  1. 根据web.xml配置的 Filter 映射和顺序创建一个 FilterChain 对象。
  2. 将 FilterChain 初始化为包含所有配置的Filters,并按照预定的顺序进行排序。
  3. 返回创建的FilterChain 对象。


总结

  Filter 使用职责链模式(Chain of Responsibility Pattern)的优势:

  • 分离责任:将处理逻辑分散到多个 Filter 中,每个 Filter 只负责特定的处理任务。这样可以将复杂的处理逻辑分解为多个独立的模块,每个模块只关注自己的责任,实现了职责的分离。

  • 可扩展性:支持添加、移除和调整处理节点。可以根据需要增加新的 Filter,也可以移除或替换现有的 Filter,而不需要修改已有的代码。这使得系统具有良好的扩展性,可以灵活地应对变化的需求。

  • 可重用性:每个 Filter 负责独立的处理任务,可以被多个不同的请求或系统复用。这样可以避免重复编写相同的处理逻辑,提高代码的可重用性和可维护性。

  • 灵活性:允许根据实际需求动态调整处理流程。可以根据请求的类型、状态或其他条件来动态选择、排列和调整 Filter 的顺序,从而灵活地定制处理流程,以满足不同的业务需求。

  通过使用职责链模式,Filter 可以形成一个灵活、可扩展和可定制的处理链,每个 Filter 只负责特定的处理任务,处理逻辑分散到不同的节点中,实现了解耦合和职责的分离。这样可以提高代码的可维护性、可重用性和灵活性,同时使系统能够适应变化的需求。


http://www.ppmy.cn/news/154564.html

相关文章

【认知提升思维篇】之 反刍思维--恶性思考的根源

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;普本…

AutoCAD 2004-2022 官方简体中文版下载直链

AutoCAD 2004-2022 官方简体中文版下载直链&#xff1a; ::历史版本下载链接需用P2P下载工具迅雷下载 ::2020或更高版仅支持Windows 7 或更高版64位 ::2015-2019或更高版支持Windows 7或更高版 ::2004-2014 支持Windows XP ::挖掘检索&#xff1a;423DOWN.COMAutoCAD 2022 x64 …

CAD 2008英文版下载(含注册机)

CAD 2008英文版下载 804M http://trialdownload.autodesk.com/enu/autocad/AutoCAD2008Trial.exe 转载于:https://blog.51cto.com/hongli/386201

AutoCAD2016简体中文破解版32位64位下载

AutoCAD2016序列号&#xff1a;666-69696969 667-98989898 400-45454545 066-66666666(任意一个) AutoCAD2016产品密钥&#xff1a;001H1 AutoCAD2016软件32位注册机&#xff1a; 点击下载 提取密码&#xff1a;77h6 AutoCAD2016软件64位注册机&#xff1a; 点击下载 提取密码…

AutoCAD2008绿色版用法

AutoCAD2008绿色版用法如下操作&#xff1a; 1、下载解压后CAD2008&#xff0c;右键“以管理员身份运行”“cad绿化安装.bat”即可;如果绿色过程弹出系统组件缺失的提示&#xff0c;请仔细看提示&#xff0c;然后到“user”目录下安装相应的系统组件后再来运行“cad绿化安装.ba…

autocad2008中文版

教程&#xff1a; 1.下载好&#xff0c;根据自己的系统选对应的版本&#xff0c;然后将其解压&#xff0c;运行acad.msi&#xff0c;开始cad2008主程序的安装 3、选择"我接受".下一步 4、选择“典型”即可&#xff0c;组件自选 5、确定安装信息&#xff0c;开始安装…

AutoCAD 2016官方中文版下载(32+64位) 简体中文官网原生下载地址

Autodesk公司出品的CAD软件&#xff0c;借助AutoCAD你可以准确地和客户共享设计数据。您可以体验本地DWG格式所带来的强大优势。DWG是业界使用最广泛的设计数据格式之一&#xff0c;您可以通过它让所有人员随时了解您的最新设计决策。AutoCAD 支持演示的图形、渲染工具和强大的…

AutoCAD 2008 简体中文版注册破解方法

作者微信&#xff1a;15013593099 欢迎交流 AutoCAD 2008 注册机&#xff1a; AutoCAD2008Chs_KeyGen.exe 请打开以下网页&#xff0c;阅读 AutoCAD 2008 简体中文版注册破解方法 http://www.zolsky.com/design/AutoCAD2008_reg.htm