[后端开发] 过滤器相关注解

一、背景

使用Springboot框架开发后端,在鉴权的时候使用到了过滤器。但是在测试的过程发现,跨域的过滤器在过滤链中出现了两次,导致前端访问后端接口时报错:The 'Access-Control-Allow-Origin' headers contains multiple values,but only one allowed.错误

在浏览器端比较正常访问接口和报错接口的headers,发现报错接口出现了两次headers,然后开始了debug之路,发现:异常接口跨域过滤器进行了重复注册,最终定位到了是注解的问题。

二、不同注解的作用

1、@Component注解

在Filter类使用了@Component注解,在不指定bean名字的前提下,会默认生成一个类名首字母小写的bean name

当在CorsFilter类上面使用@Component注解,默认生成bean name是corsFilter,访问接口的时候会按照过滤器链按顺序进行过滤;

2、@WebFilter + @ServletComponentScan注解

在Filter类上线使用了@WebFilter注解,在不指定名字的情况下,默认的名字是类的完全限定名,也就是包名+类名,比如:com.example.filters.ExampleFilter。

@ServletComponentScan注解作用:@ServletComponentScan 注解告诉 Spring Boot 在启动时扫描特定的包,以查找使用 @WebFilter@WebServlet@WebListener 注解的类,并将它们注册为相应的 Servlet API 组件。

3、注册过滤器的两种方法

@Component注解

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;@Component
public class FilterConfig {@Beanpublic FilterRegistrationBean<ExampleFilter> exampleFilterRegistration() {FilterRegistrationBean<ExampleFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new ExampleFilter());registration.addUrlPatterns("/example/*");registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置过滤器的顺序return registration;}
}

OR

@WebFilter + @ServletComponentScan两个注解必须同时使用

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan("com.example.filters") // 指定过滤器所在的包
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
@WebFilter(filterName = "exampleFilter", urlPatterns = "/example/*")
public class ExampleFilter implements Filter {// 实现过滤器的逻辑
}

三、其他

定位方法:查看过滤链

虽然有两个过滤器都同时使用了@WebFilter注解和@Component注解,但由于其中一个过滤器在使用@WebFilter注解的时候指定了名字,和@Component默认生成的名字一致,所以在过滤器链中只有一个;

但另一个在使用@WebFilter注解时没有指定名字,所以两个注解分别注册了两个不同名字的bean,导致在调用对应接口时出错。

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

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

相关文章

【word】文档标题如何自动编号

我在写一个word文档的时候&#xff0c;每一级标题的格式都设置好了&#xff0c;包括字体&#xff0c;大小等等&#xff0c;但是如何自动编号呢&#xff1f; 在写中期报告的时候&#xff0c;我对每一级标题的格式都创建了一个单独的样式&#xff0c;像这样&#xff1a; 对于每一…

探索Spring、Spring Boot和Spring Cloud的奇妙关系(二)

本系列文章简介&#xff1a; 在当今快节奏、高竞争的软件开发世界中&#xff0c;构建可靠、高效的应用程序是至关重要的。而Spring框架一直以来都是业界领先的Java开发框架之一&#xff0c;帮助开发者简化了复杂的任务&#xff0c;并提供了丰富的功能和强大的支持。 然而&#…

Vue3——Tinymce6富文本编辑器的使用方法

TinyMCE 6 是一款功能强大且灵活的富文本编辑器&#xff0c;可以嵌入到 Web 应用程序中。 一、安装 本文的讲解主要以tinymce6 版本为例 官网地址 Migrating from TinyMCE 5 to TinyMCE 6 | TinyMCE Documentation ​ 要将 TinyMCE 添加到项目中&#xff0c;请执行以下操…

IO流及流的分类

1.java IO流 (1). java程序中&#xff0c;对于数据的输入输出操作是以流的方式进行的.可以看作是数据的流动. (2). IO流中的I/O的input/output的缩写.IO技术是非常实用的技术.用于处理设备之间的数据传输&#xff0c;比如读写文件. 以程序作为参考点.input() : 读取外部数据…

ssh: connect to host github.com port 22: Connection refused fatal

ssh: connect to host github.com port 22: Connection refused 是连接github.com的端口号22拒绝连接。 可以使用github的443端口 $ vim ~/.ssh/config # 如果没有config 文件就新建一个 Host github.com Hostname ssh.github.com Port 443

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python框架之UnitTest

unittest 是python 的单元测试框架&#xff0c;unittest 单元测试提供了创建测试用例&#xff0c;测试套件以及批量执行的方案&#xff0c; unittest 在安装pyhton 以后就直接自带了&#xff0c;直接import unittest 就可以使用&#xff0c;测试人员用UnitTest来做自动化测试&a…

【CSS】盒子居中

目录 效果图 代码及其解释 补充解释 效果图 同时实现盒子与文字的居中 代码及其解释 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">#box1{width: 500px;height:…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服&#xff0c;游戏分为三个势力&#xff0c;分别是阿斯达、亚高和不罚者&#xff0c;每个玩家都必须选择一个势力&#xff0c;而每个势力每周将会诞生一名势力族长&#xff0c;将会从五名候选人中投票产生&#xff0c;想要进入候选人名单&#xff0c;必须每天…

Netty学习——实战篇2 NIO 群聊系统(简单版) 备份

需求&#xff1a; 1、编写一个NIO群聊系统&#xff0c;实现服务端和客户端之间数据简单通讯(非阻塞) 2、实现多人群聊 3、服务端&#xff1a;可以监测用户上线、离线、并实现消息转发功能。 4、客户端&#xff1a;通过channel可以无阻塞发送消息给其他所有用户&#xff0c;同时…

.NET 设计模式—观察者模式(Observer Pattern)

简介 在.NET中&#xff0c;观察者模式是一种设计模式&#xff0c;它允许对象之间进行一对多的依赖关系。当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会收到通知并自动更新。这种模式在事件驱动的设计中非常常见。 在.NET中实现观察者模式&#xff0c;通常涉…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错&#xff0c;就是在提示你哪里错的地方上方注释一行/*eslint-disable*/&#xff0c;之前一直警告这个错误感谢老师&#xff01; 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢&#xff1f;答案是子组件先挂…

Qt---控件的基本属性

文章目录 enabled(控件可用状态)geometry(位置和尺寸)简单恶搞程序 windowIcon(顶层 widget 窗口图标)使用 qrc 机制 windowOpacity(窗口的不透明值)cursor(当鼠标悬停空间上的形状)自定义鼠标图标 toolTip(鼠标悬停时的提示)focusPolicy(控件获取焦点的策略)styleSheet(通过CS…

【Python实践应用】使用Python加载栅格数据

下面的代码实现的是加载伊宁市NDVI数据&#xff0c;首先进行相关的python包的导入&#xff0c;然后定义和读取我们需要加载的数据&#xff0c;这里我们使用的NDVI数据是将伊宁23年的NDVI数据合并成为了一张栅格图像&#xff0c;每个波段表示一年的 NDVI&#xff0c;我们这里显示…

web前端之element级联选择器的那些事、获取label的值、getCheckedNodes、cascader、ref

MENU 动态加载时获取value和label的值 动态加载时获取value和label的值 前言 1、使用ref的getCheckedNodes方法获取label的值&#xff0c;change事件只传递value值&#xff1b; 2、回显自动处理&#xff0c;无需手动干预&#xff0c;设置好接口即可。 html <el-cascader r…

MySQL学习笔记3——条件查询和聚合函数

条件查询和聚合函数 一、条件查询语句二、聚合函数1、SUM&#xff08;&#xff09;2、AVG()、MAX()、MIN()3、COUNT&#xff08;&#xff09; 一、条件查询语句 WHERE 和 HAVING 的区别&#xff1a; WHERE是直接对表中的字段进行限定&#xff0c;来筛选结果&#xff1b;HAVIN…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…