面试官:说一下Filter过滤器的执行顺序

背景说明

各位小伙伴大家好,我是全栈小白

相信各位小伙伴都用过Filter过滤器吧,在学习servlet的时候,Filter可是我们认证的好帮手,但是在学习了SpringBoot框架之后,Filter可能被大家遗忘了,相对Spring框架而言,提供的拦截器不管在使用上、功能上都要比过滤器方便很多

最近有小伙伴在使用zuul网关的时候使用到了Filter过滤器,对于执行顺序,还是有必要了解一下

事情是这样的:

有三个Filter过滤器、分别是

UserAuthFilter(用来判断用户是否登录)

XssRouterFilter(用来给不同路由规则封装请求参数)

SensitiveFilter(用来做敏感词的过滤)

项目运行之后,它的执行顺序是这样子的UserAuthFilter->SensitiveFilter->XssRouterFilter

顺序没有问题,符合开发者的预期,但是将XssRouterFilter类名改为AXssRouterFilter顺序竟然发生了变化

经过测试执行顺序是:AXssRouterFilter->UserAuthFilter->SensitiveFilter,这是为什么呢?

言归正传

首先我们了解一下Filter过滤器的两种配置方式

第一:使用@WebFilter注解进行配置

/** @Project:WebFilterCase* @Author:cxs* @Motto:放下杂念,只为迎接明天更好的自己* */
@WebFilter(filterName = "OneFilter", urlPatterns = "/*")
public class OneFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("请求经过过滤器:OneFilter");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

第二种:使用web.xml进行配置

<filter><filter-name>TwoFilter</filter-name><filter-class>com.cxs.filter.TwoFilter</filter-class>
</filter>
<filter-mapping><filter-name>TwoFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

我们先使用方式一配置3个过滤器查看执行流程

image-20240229163757360

我们的预期是OneFilter->TwoFilter->ThreeFilter,但实际是OneFilter->ThreeFilter->TwoFilter

我们使用方式二配置3个过滤器查看执行流程

<?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_3_1.xsd"version="3.1"><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.cxs.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><filter><filter-name>OneFilter</filter-name><filter-class>com.cxs.filter.OneFilter</filter-class></filter><filter-mapping><filter-name>OneFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>TwoFilter</filter-name><filter-class>com.cxs.filter.TwoFilter</filter-class></filter><filter-mapping><filter-name>TwoFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>ThreeFilter</filter-name><filter-class>com.cxs.filter.ThreeFilter</filter-class></filter><filter-mapping><filter-name>ThreeFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

image-20240229164133387

我们的预期是OneFilter->TwoFilter->ThreeFilter,实际是OneFilter->TwoFilter->ThreeFilter,与预期一致

总结:

  • web.xml中配置的过滤器,这个调用顺序是和Filter的filter-mapping的配置有关,调用顺序从上到下,也就是说上面的配置先于下面的先调用,和filter配置的顺序无关。
  • 通过@WebFilter注解进行配置的过滤器,执行顺序会按照字母的顺序执行,暂时无法自定义顺序

结语

1、制作不易,一键三连再走吧,您的支持永远是我最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498458.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简析:网红老隋分享的temu蓝海项目能赚钱吗?

在如今这个信息化时代&#xff0c;网红老隋凭借其丰富的投资经验和市场洞察力&#xff0c;分享了许多具有潜力的蓝海项目。其中&#xff0c;temu项目备受关注&#xff0c;许多人好奇这个项目能否带来收益。下面&#xff0c;我将从市场前景、竞争状况、盈利模式等方面进行分析&a…

Edge 开启网页选择功能(Web Select)

微软禁用了Web Select功能 本着什么功能好用就禁用什么的原则, 微软又禁用了Web Select的功能, 相信这个功能用过的人都说好, 还有好多人不知道这个功能 开启方式, 快捷方式添加启动参数 --enable-featuresmsEdgeAreaSelect 如图 重启电脑或者杀掉进程才能生效 kill命令 kil…

BY组态功能清单

演示地址 &#xff1a;http://www.byzt.net:60/sm/ 官网地址&#xff1a;http://www.hcy-soft.com BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架…

SpringBoot案例(黑马学习笔记)

这个案例呢&#xff0c;就是Tlias智能学习辅助系统。 参考接口文档完成后端功能的开 发&#xff0c;然后结合前端工程进行联调测试即可。 完成后的成品效果展示&#xff1a; 准备工作 需求&环境搭建 需求说明 部门管理 部门管理功能开发包括&#xff1a; ● 查询部门列…

c# .net8 香橙派orangepi + hc-04蓝牙 实例

这些使用c# .net8开发&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04蓝牙 使用场景&#xff1a;可以通过这个功能&#xff0c;手机连接orangepi进行wifi等参数配置 硬件&#xff1a; 1、带USB口的linux开发板orangepi 2、USB 转TTL 中转接蓝牙&#xff08;HC-04) 某宝上买…

Groovy - 大数据共享搜索配置

数据共享搜索列中配置了搜索列&#xff0c;相应的数据共享接口中也需要支持根据配置的字段搜索&#xff0c;配置实体时&#xff0c;支持搜索的入参code必须是searchKeys&#xff0c;且接口应该是需要支持分页&#xff08;入参必须是 current、pageSize&#xff09;的。current …

动态规划总结

参考来源&#xff1a;代码随想录 文章目录 基础概念具体应用的问题基础问题背包问题0-1背包完全背包 打家劫舍问题股票买卖问题子序列问题 基础概念 状态推导&#xff1a;动态规划中每一个状态一定是由上一个状态推导出来的。 动规五部曲&#xff1a; 确定dp[i]或者dp[i][j]…

OpenAI Triton 入门教程

文章目录 Triton 简介背景Triton 与 CUDA 的关系 Triton 开发样例样例一&#xff1a;Triton vector addition 算子Triton kernel 实现kernel 函数封装函数调用性能测试 样例二&#xff1a;融合 Softmax 算子动机Triton kernel 实现kernel 封装单元测试性能测试 样例三&#xff…

gpt-3.5-turbo与星火认知大模型v3.5回答对比

创建kernel // Create a kernel with OpenAI chat completionKernel kernel Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId:"使用的模型id" ,apiKey: "APIKey").Build();使用讯飞星火认知大模型的话&#xff0c;可以参考我这一篇文章&#xff…

C++ 反向迭代器的设计与实现

在本文开始之前&#xff0c;先明晰几个 关键词 的含义&#xff08;T : 模板参数&#xff09;&#xff1a; Ref : T& / const T&Ptr : T* / const T* 一、反向迭代器设计的上帝视角 我们希望将 反向迭代器 设计成一种适配器——传 list::iterator 得到 list 的反向迭代…

代码随想录刷题笔记-Day25

1. 分割回文串 131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/ 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xf…

数据分析全流程解析:从数据预处理到分析建模,再到结果可视化

在当前信息化时代&#xff0c;数据分析成为了企业决策、科研创新的关键。高效、准确地从海量数据中提取有价值的信息&#xff0c;需要经过数据预处理、分析建模、结果可视化等一系列步骤。本文将详细介绍这一流程&#xff0c;并提供Python代码示例&#xff0c;帮助读者更好地理…