多个OncePerRequestFilter过滤器实现的使用及顺序

多个OncePerRequestFilter过滤器实现的使用及顺序

作用

  1. 在一次外部请求中只过滤一次, 对于服务器内部之间的forward等请求,不会再次执行过滤方法
  2. 可以定义多个实现类, 各自处理各自的过滤工作, 并指定过滤顺序

使用场景

  1. token校验有效性
  2. Xss处理
  3. 敏感词汇过滤 …

场景案例

芋道中的过滤器顺序定义

public interface WebFilterOrderEnum {int CORS_FILTER = Integer.MIN_VALUE;int TRACE_FILTER = CORS_FILTER + 1;int ENV_TAG_FILTER = TRACE_FILTER + 1;int REQUEST_BODY_CACHE_FILTER = Integer.MIN_VALUE + 500;// OrderedRequestContextFilter 默认为 -105,用于国际化上下文等等int TENANT_CONTEXT_FILTER = - 104; // 需要保证在 ApiAccessLogFilter 前面int API_ACCESS_LOG_FILTER = -103; // 需要保证在 RequestBodyCacheFilter 后面int XSS_FILTER = -102;  // 需要保证在 RequestBodyCacheFilter 后面// Spring Security Filter 默认为 -100,可见 org.springframework.boot.autoconfigure.security.SecurityProperties 配置属性类int TENANT_SECURITY_FILTER = -99; // 需要保证在 Spring Security 过滤器后面int FLOWABLE_FILTER = -98; // 需要保证在 Spring Security 过滤后面int DEMO_FILTER = Integer.MAX_VALUE;}

使用

当前过滤器为定义在springboot组件中, 使用springboot的自动装配进行引入的
故使用的 方法1

  • 方法1. 创建FilterRegistrationBean< T extends Filter>对象,指定过滤器,并指定顺序 + @Bean + @AutoConfiguration 方式
  • 方法2. 单体架构为了方便 可以在@Component+@Order() 放在过滤器类上

1.定义过滤器

import cn.hutool.core.util.StrUtil;
import com.caeri.framework.common.pojo.CommonResult;
import com.caeri.framework.common.util.servlet.ServletUtils;
import com.caeri.framework.web.core.util.WebFrameworkUtils;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import static com.caeri.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY;/*** 演示 Filter,禁止用户发起写操作,避免影响测试数据** @author 芋道源码*/
public class DemoFilter extends OncePerRequestFilter {// 定义哪些请求进入过滤器 (不定义则全部都进入)// 可以将需要过滤的情况定义出来,加上 !@Overrideprotected boolean shouldNotFilter(HttpServletRequest request) {String method = request.getMethod();return !StrUtil.equalsAnyIgnoreCase(method, "POST", "PUT", "DELETE")  // 写操作时,不进行过滤率|| WebFrameworkUtils.getLoginUserId(request) == null; // 非登录用户时,不进行过滤}// 过滤器需要执行的逻辑@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {// todo 执行逻辑// 继续过滤chain.doFilter(request,response);}}

2.自动配置类中定义Bean

@AutoConfiguration
public class WebAutoConfiguration {@Bean@ConditionalOnProperty(value = "yudao.demo", havingValue = "true")public FilterRegistrationBean<DemoFilter> demoFilter() {// 过滤器注册BeanFilterRegistrationBean<DemoFilter> bean = new FilterRegistrationBean<>(new DemoFilter());// 设置顺序, 通过上面定义枚举来统一管理bean.setOrder(WebFilterOrderEnum.DEMO_FILTER);return bean;}
}

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

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

相关文章

驶向高效巅峰:Nginx高并发性能优化实战指南与场景案例拆解

身处瞬息万变的互联网世界&#xff0c;高并发场景下服务器的性能优化尤为重要&#xff0c;而Nginx正是这一领域的超级舵手。本文将深入浅出地揭示Nginx在高并发环境下的性能优化之道&#xff0c;并通过具体场景配置案例&#xff0c;助你掌握这一关键技术&#xff0c;提升服务器…

静态网络配置

一、查看网络命令 1.命令行查看网络配置 1、查看ip\硬件设备-网卡 ifconfig -a ifconfig ens160 网卡名称 ip addr show ip addr show ens160 nmcli device show ens160 nmcli con up ens160 2、主机名称 hostname hostname hfj.huaxia.com 3、查看路由和网关 rou…

慎投!共10本「On Hold」期刊被剔除,2本中科院TOP仍在调查中!

2024年3月18日&#xff0c;科睿唯安本年度第三次更新了Web of Science核心期刊目录。 此次SCIE/SSCI期刊目录共8本期刊发生变动&#xff0c;情况如下&#xff1a; 经小编查询&#xff0c;此次更新后&#xff0c;共有7本“On Hold”期刊被数据库剔除&#xff0c;其中还包括2024年…

Winsock编程入门和枚举协议

Winsock的初始化和清除代码类似如下; if ((ret = WSAStartup(MAKEWORD(2,2), &wsadata)) != 0) { wsprintf(buf,TEXT("winsock初始化失败,错误:%d"), ret); ...... return 0; } 。。。。。。 if (WSACleanup() == SOCKET_ERRO…

手撕算法-最长公共子序列(二)

最长公共子序列(二) 分析&#xff1a;典型的动态规划&#xff0c;直接看代码了。 代码&#xff1a; import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** longest common sub…

VS+QT Debug正常但Release无法识别头文件

&#xff01;&#xff01;&#xff01;&#xff0c;这个问题一般是在第一次编译的时候遇见的&#xff0c;包括之前使用debug也是 在Qt Installation一定要修改成自己版本的编译器&#xff0c;修改一次以后基本是不用再修改的

【机器学习】TinyML的介绍以及在运动健康领域的应用

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

将图像根据注释文件划分

import os import json import shutil# 完整图像文件夹路径 img_dir data\sodaa\datasets# 注释文件夹路径 train_ann_dir data\sodaa\Annotations\\train val_ann_dir data\sodaa\Annotations\\val test_ann_dir data\sodaa\Annotations\\test# 输出文件夹路径 output_dir…

5465: 【搜索】奶牛干饭

题目描述 农场主John把农场分为了一个 r 行 c 列的矩阵&#xff0c;并发现奶牛们无法通过其中一些区域。此刻&#xff0c;Bessie 位于坐标为 (1,1) 的区域&#xff0c;并想到坐标为 (r,c) 的牛棚享用晚餐。她知道&#xff0c;以她所在的区域为起点&#xff0c;每次移动至相邻的…

全球盲盒火热下,海外盲盒APP助力我国盲盒出海

盲盒具有不确定性&#xff0c;与各类热门影视动漫合作推出的专属盲盒商品&#xff0c;吸引了无数年轻人&#xff0c;成为了年轻人的娱乐消费首选方式。 在互联网电商的推动下&#xff0c;盲盒在全球内的市场规模迅速扩大。受到市场增长的影响&#xff0c;各类资本公司也纷纷进…

【Python多线程】的进阶讲解

Python多线程 1. 前言2. threading 模块的基本用法3. Thread类4. 锁&#xff08;Locks&#xff09;5. 守护线程&#xff08;Daemon Threads&#xff09;6. 运用场景7. 弊端 1. 前言 Python中的多线程通过threading模块来实现&#xff0c;它允许你并发执行多个线程&#xff0c;…

深入浅出前端本地储存(1)

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

基于python的4s店客户管理系统

技术&#xff1a;pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展&#xff0c;并和生活进行了紧密的结合。目前&#xff0c;网络的运行速度以达到了千兆&#xff0c;覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

pyvista可视化代码优化

同时显示多组点云 import os import glob import randomimport pyvista as pvdef display_multi_mesh(meshes: list, titlesNone, point_size3, opacity0.9):num len(meshes)pl pv.Plotter(shape(1, num))pl.set_background([0.9, 0.9, 0.9])for i in range(num):pl.subplo…

jmeter打开文件报异常无法打开

1、问题现象&#xff1a; 报错部分内容&#xff1a; java.desktop does not export sun.awt.shell to unnamed module 0x78047b92 [in thread "AWT-EventQueue-0"] 报错部分内容&#xff1a; kg.apc.jmeter.reporters.LoadosophiaUploaderGui java.lang.reflect.Invo…

feign设置超时时间

feign设置超时时间 feign的 本质是 调用 http请求&#xff0c;如果不设置超时时间&#xff0c;请求长时间连接着&#xff0c;占用系统资源&#xff0c;影响用户体验。 feign设置超时时间&#xff0c;可以通过 Request.Options 来设置。 FeignClientFactoryBean &#xff1a;…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口&#xff0c;restartalways表示随时在线&#xff0c;重启机器后也…

5 Redis主从集群

文章目录 Redis主从集群1.1主从集群搭建1.1.1 伪集群搭建与配置1.1.2 分级管理1.1.3 容灾冷处理 1.2主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程 2.1 哨兵机制实现2.1.1 简介2.2.2 Redis 高可用集群搭建2.2.3 Redis 高可用集群的启动2.2.4 Sentinel 优化配置 3.1 哨…

Java数组新手冷知识

J a v a Java Java 中&#xff0c;数组是对象&#xff0c;当你将一个数组传递给方法时&#xff0c;你其实是传递了数组的引用&#xff08;地址&#xff09;&#xff0c;而不是数组的副本。因此&#xff0c;在 m m m 方法中修改了数组 n n n 的内容后&#xff0c;这种改变在方…

算法笔记p414拓扑排序

目录 有向无环图拓扑排序求拓扑排序步骤代码实现 例题 有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身&#xff0c;那么称这个有向图为有向无环图&#xff08;DirectedAcyclic Graph&#xff0c;DAG&#xff09;。 拓扑排序 拓扑排序是将有向无环图G的所…