集成springSecurity遇到的跨域问题

news2024/10/6 18:26:56

引言

该项目主要使用技术:sprinboot、springSecurity、vue,其它的技术就不介绍了

其中springSecurity是我参考网上的案例去进行的集成,虽然集成成功了,但是还不是太懂。

下面就开始介绍一下我遇到的问题

问题重现

由于我项目后端集成了springSecurity,所以项目的登录验证和鉴权就是使用的springSecury来进行的,前端的话使用的element-ui-admin作为模板进行二开。

起初前端在进行登录的时候是可以正常访问后端不会出现跨域的问题,直到到了后面请求我的一个delete接口,这个时候就出现了跨域的问题,通过f12可以看见报403错误以及options错误

尝试修改Configuration(×)

然后我就去调我后端之前配置的跨域配置,如下是我原来的配置:

/**
 * <p>
 * 解决跨域问题
 * </p>
 *
 * @author:雷子杰
 * @date:2022/10/29
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("*")//允许任何方法
                .allowCredentials(true)
        		.maxAge(3600);
    }
}

其实我这个配置是没问题的,所以改来改去还是没啥作用。

尝试增加@CrossOrigin(×)

然后我就想到在Controller层增加@CrossOrigin,但是加了后还是没啥用

尝试更改前端跨域(×)

前端跨域就是webpack来进行请求代理,在vue.config.js中去添加以下即可,但是我添加了后,似乎是没了跨域的问题,但出现了新的问题,前端传过去的request中的数据是null(无法获取登录时用户传过去的数据,但前端确实是传过去了的)

devServer: {
  port: port,
  open: true,
  overlay: {
    warnings: false,
    errors: true
  },
  before: require('./mock/mock-server.js'),
  proxy: {
    '/api': {
      // 代理名称   凡是使用/api开头的地址都是用此代理
      target: 'http://192.168.1.6:8888', // 需要代理访问的api地址
      changeOrigin: true, // 允许跨域请求
      secure: false, // 忽略 HTTPS 安全提示
      pathRewrite: {
        // 重写路径,替换请求地址中的指定路径
        '^/api': '' // 将请求地址中的/api替换为空,也就是请求地址中不会包含/api/
      }
    }
  },
  disableHostCheck: true
}

问题原因

产生问题的原因在标题就已经说明了,就是跨域的问题,但是产生的原因的话,不太清楚,我后面看了下我之前下载的编程不良人springSecurity的笔记,发现他在笔记中写道如下:

后端跨域问题的解决的三种解决方案

  • @CrossOrigin

    Spring 中第一种处理跨域的方式是通过@CrossOrigin 注解来标记支持跨域,该注解可以添加在方法上,也可以添加在 Controller 上。当添加在 Controller 上时,表示 Controller 中的所有接口都支持跨域

    @RestController
    public Class HelloController{
    	@CrossOrigin (origins ="http://localhost:8081")
    	@PostMapping ("/post")
    	public String post (){
    		return "hello post";
    	}
    }
    
  • addCrosMapping

    @CrossOrigin 注解需要添加在不同的 Controller 上。所以还有一种全局配置方法,就是通过重写 WebMvcConfigurerComposite#addCorsMappings方法来实现,具体配置如下:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer{
      Override
      public void addCorsMappings (CorsRegistry registry){
        registry.addMapping("/**") //处理的请求地址
        .allowedMethods ("*")allowedorigins("*")
        .allowedHeaders ("*")
        .allowCredentials (false)
        •exposedHeaders ("")
        .maxAge (3600) ;
      }
    }
    
  • CrosFilter

    Cosr Filter 是Spring Web 中提供的一个处理跨域的过滤器,开发者也可以通过该过该过滤器处理跨域。

    @Configuration
    public class WebMvcConfig {
        @Bean
        FilterRegistrationBean<CorsFilter> corsFilter() {
            FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
            corsConfiguration.setAllowedMethods(Arrays.asList("*"));
            corsConfiguration.setAllowedOrigins(Arrays.asList("*"));
            corsConfiguration.setMaxAge(3600L);
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", corsConfiguration);
            registrationBean.setFilter(new CorsFilter(source));
            registrationBean.setOrder(-1);//filter 0 1
            return registrationBean;
        }
    }
    

SprngSecurity跨域原理分析

当我们为项目添加了 Spring Security 依赖之后,发现上面三种跨域方式有的失效了,有
则可以继续使用,这是怎么回事?

通过@CrossOrigin 注解或者重写 addCorsMappings 方法配置跨域,统统失效了,通
CorsFilter 配置的跨域,有没有失效则要看过滤器的优先级,如果过滤器优先级高于 Sp
Security 过滤器,即先于 Spring Security 过滤器执行,则 CorsFiter 所配置的跨域处理依然有效;如果过滤器优先级低于 Spring Security 过滤器,则 CorsFilter 所配置的跨域处理就会失效。

为了理清楚这个问题,我们先简略了解一下 Filter、DispatchserServlet 以及Interceptor 执行顺序。

image-20220521074711128

理清楚了执行顺序,我们再来看跨域请求过程。由于非简单请求都要首先发送一个预检请求
request),而预检请求并不会携带认证信息,所以预检请求就有被 Spring Security 拦截的可能。因此通过@CrossOrigin 注解或者重写 addCorsMappings 方法配置跨域就会失效。如果使用 CorsFilter 配置的跨域,只要过滤器优先级高于 SpringSecurity 过滤器就不会有问题。反之同样会出现问题。

解决方案

Spring Security 中也提供了更专业的方式来解决预检请求所面临的问题。如:

关键位置:configurationSource().cors().configurationSource(configurationSource())

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
		@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .and()
                .cors() //跨域处理方案
                .configurationSource(configurationSource())
                .and()
                .csrf().disable();
    }

    //这个是配置跨域方法
    CorsConfigurationSource configurationSource() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
        corsConfiguration.setAllowedOrigins(Arrays.asList("*"));
        corsConfiguration.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        return source;
    }
}

最终我解决的方式就是去掉我之前配置的addCrosMapping,在springSecurity的配置文件中去进行跨域配置操作

总结

在学习的路上总是会遇到许多问题,一时无法解决不要紧,只要找准了方向,就一定能够解决!

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

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

相关文章

[附源码]Python计算机毕业设计Django自行车租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【LSTM时序预测】基于LSTM实现时间序列神经网络预测附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

行话|入局「软件定义汽车」,你真的准备好了吗?

什么是行话&#xff1f; 「行话」&#xff0c;是极狐 GitLab 推出的全新内容系列&#xff0c;探讨 Git 与 DevOps 在不同行业的实践场景与解决方案&#xff0c;希望能够为不同行业的软件开发者带来一些全新的思考和输入。 说行业&#xff0c;讲行话。 这一期&#xff0c;我们…

MMPose 实践笔记

1. 配置环境 参考&#xff1a;https://mmpose.readthedocs.io/zh_CN/latest/install.html 第 1 步 使用 MIM 安装 MMCV pip install -U openmim -i https://pypi.tuna.tsinghua.edu.cn/simple mim install mmcv-full第 2 步 安装 MMPose 我选择 从源码安装 git clone http…

Vector-常用CAN工具 - CANoe入门到精通_00

今天在梳理的时候突然发现写的CANoe工具入门到精通系列缺少了CANoe安装&#xff0c;实际对于CANoe的安装并不难&#xff0c;在“Vector-常用CAN工具 - CANoe入门到精通_01”中我有提过我们常说的CANoe主要由VN1640或者VN1640以及CANpiggy等硬件加上CANoe软件组成了我们工作中常…

Python3,9行批量提取PDF文件的指定内容,这种操作,保证人见人爱....

批量提取PDF文件指定内容1、引言2、代码实战2.1 介绍2.2 安装2.3 实例3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 你有没有什么办法&#xff0c;提取PDF文档的内容。 小鱼&#xff1a;这个还问我&#xff1f;&#xff1f; 小屌丝&#xff1a;哎呀&#xff0c;这个不是…

leetcode题17电话号码的字母组合-java题解-回溯篇

说明&#xff1a;问题描述来源leetcode: 一、问题描述: 17. 电话号码的字母组合 难度中等2219 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注…

【踩坑专栏】关于实现异步多线程的一些踩坑

在实现基于redis的分布式锁的时候&#xff0c;有一项功能&#xff0c;就是通过开启异步线程&#xff0c;对还没有unlock的key进行定时刷新&#xff0c;延长时间。 初始版本是New一个线程start。我们知道New一个线程&#xff0c;用了没多久又抛弃&#xff0c;这种方法非常消耗资…

【浅学Java】SpringBoot 日志文件

SpringBoot 日志文件1. 认识日志文件1.1. 日志文件有什么用&#xff1f;1.2 日志文件的格式2. 自定义日志文件的打印3. 日志的持久化3.0 什么时日志持久化3.1 设置日志名称3.2 设置日志目录3.3 持久化日志的特点4. 日志的级别5. 设置“日志级别”来筛选日志6. 简化日志打印——…

量子计算(十二):量子线路与测量操作

文章目录 量子线路与测量操作​​​​​​​ 量子线路与测量操作​​​​​​​ 量子线路是由代表量子比特演化的路线和作用在量子比特上的量子逻辑门组成的。量子线路产生的效果&#xff0c;等同于每一个量子逻辑门依次作用在量子比特上。在真实的量子计算机上&#xff0c;最…

HTML CSS游戏官网网页模板 仿绝地求生吃鸡游戏网站 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

[附源码]Python计算机毕业设计Django影院管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

使用yum info查看软件包信息与常用软件包

记录&#xff1a;357 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用yum info查看软件包信息&#xff0c;包括软件包名称、适用架构、版本号、发行版、软件大小、仓库名称、概要、URL、许可证、描述。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.iptabl…

【现代机器人学】学习笔记三:前向运动学(Forward Kinematics)

这节的内容比较简单&#xff0c;主要配合习题来看。 在掌握方法以后&#xff0c;对常规的有许多移动副或转动副结构组成的机械臂&#xff0c;计算正向运动学则非常简单。 齐次变换法&#xff1a; 这种方法的特点是&#xff0c;只研究当前关节和上一个关节的旋转平移&#xf…

供应商关系管理与企业内容管理 (ECM) 相结合,帮助解决采购存在的五个关键挑战

供应商关系管理与企业内容管理 &#xff08;ECM&#xff09; 相结合&#xff0c;帮助解决采购存在的五个关键挑战 采购过程包括将制造需求转化为供应商需求、如何管理供应商关系、以及生产产品所需的商品和服务的订购。 领先的制造、制药、食品和自然资源组织正在意识到&#…

【性能优化】pc端与移动端图片性能优化

目录 优化方向 优化方式 1.域名收敛 2.使用CDN节点 3.设置缓存 4.图片懒加载 5.用户图片上传限制 6.使用OSS服务压缩 7.使用OSS缩放 8.合成雪碧图 9.使用svg图片 在前端项目中图片的性能优化也有不少可以提升的地方&#xff0c;那么有哪些性能优化的点呢&#xff1f…

[附源码]Python计算机毕业设计Django游戏交易平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

NEMUCOD病毒jse样本分析

该病毒使用微软的JScript编写&#xff0c;能够直接运行在Windows操作系统之上&#xff0c;采用了加密和混淆手段对抗监测&#xff0c;可检测是否运行在虚拟机中和系统中是否存在分析工具&#xff0c;可感染可移动存储介质&#xff0c;主要功能为下载器。CC服务器为185.159.82.1…

牛客网刷题【BC114\BC123\BC125\BC13\BC93\BC95】

目录 一、BC114 小乐乐排电梯 二、BC123 小乐乐找最大数 三、BC125 小乐乐转换成绩 四、BC13 ASCII码 五、BC93 统计数据正负个数 六、BC95 最高分与最低分之差 一、BC114 小乐乐排电梯 #include <stdio.h>int main() {int n0;scanf("%d",&n…

Aspose.Words 22.12.0 for NET cRACK

.NET API 来处理 Word 文件 无需使用外部软件即可创建、编辑、呈现 Word 文档并将其转换为多种格式。您还可以生成报告以可视化数据。 .NET 的 Aspose.Words Aspose.Words for .NET 是一种高级文档处理 API&#xff0c;可对各种文件格式执行广泛的管理和操作任务。API 支持…