【深入浅出 Spring Security(九)】解决跨域问题和 Axios 所需配置

跨域

  • 一、SpringMVC 跨域的解决方案
    • @CrossOrigin(注解的方式解决)
    • addCorsMappings(实现WebMvcConfigurer接口,重写方法)
  • 二、Spring Security 跨域的解决方案
    • 前后端跨域测试(前端相关配置)

啥是跨域?
在小编的这篇博客中阐述了——【AJAX】AJAX的跨域问题,这编只说跨域的方案。

这里说明一下下面SpringMVC 跨域方案测试案例中前端的核心代码如下,就一个 Ajax 请求,然后将内容渲染出来:
首先是对 axios 的一些初始化:
在这里插入图片描述然后向后端发送Ajax请求,将响应数据渲染,代码如下:

<script setup>
import { ref } from 'vue'
import axios from '../utils/index.js'
const content = ref('')

axios.get(`/test`).then(res=>{
    content.value = res
}).catch(err=>{
    console.log(err)
})
</script>

<template>
    <div>{{content}}</div>
</template>

如果没有跨域成功会有如下错误:
在这里插入图片描述

一、SpringMVC 跨域的解决方案

@CrossOrigin(注解的方式解决)

SpringMVC 中第一种处理跨域的方式是通过 @CrossOrigin 注解来标记支持跨域,该注解可以添加在方法上,也可以添加在类上——根据如下框住的元注解可知:
在这里插入图片描述具体案例配置如下:

@RestController
public class TestController {

    @CrossOrigin("http://localhost:5173")
    @GetMapping("/test")
    public String test(){
        return "test";
    }

}

@CrossOrigin 注解各属性含义如下:

  • maxAge:预检请求的有效期,有效期内不必再次发送预检请求,默认是 -1.
  • methods:允许的请求方法,*表示允许所有方法(请求方式).
  • origins:允许的域,* 表示允许所有域,和 value 属性是一样的。

案例测试结果如下

在这里插入图片描述

addCorsMappings(实现WebMvcConfigurer接口,重写方法)

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

@Configuration
public class WebMvcOriginConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")// 对所有请求进行跨域
                .allowedOriginPatterns("http://localhost:5173")
                .maxAge(-1)
                .allowedMethods("*");
    }
}

TestController

@RestController
public class TestController {

    // @CrossOrigin("http://localhost:5173")
    @GetMapping("/test")
    public String test(){
        return "test";
    }

}

测试结果

在这里插入图片描述

二、Spring Security 跨域的解决方案

当我们为项目添加了 Spring Security 依赖之后,上面俩种跨域方式会失效。 所以咱得会 Spring Security 为我们提供的跨域方案。

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .addFilterAfter(loginFilter(http),LogoutFilter.class)
                .cors()
                .configurationSource(this.corsConfigurationSource())
                .and()
                .csrf()
                .disable()
                .build();
    }

    private CorsConfigurationSource corsConfigurationSource(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*"); // 这个得加上,一些复杂的请求方式会带有header,不加上跨域会失效。
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addExposedHeader("*");
        corsConfiguration.addAllowedOriginPattern("http://localhost:5173");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return source;
    }

注1:corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedHeader(" * “);
corsConfiguration.addExposedHeader(” * ");
这三都应该加上,原因1:一些请求方式发送的请求会带有请求头,不允许的话会被 CorsFilter 过滤器给过滤掉,即跨域失败;原因2:凭证信息不包含的话那认证过滤的时候会失败,从而导致请求失败。

注2:那配置的安全过滤器链的方法里,有配置自定义的 LoginFilter,那是用于处理 JSON 格式的登录认证,在小编深入浅出Spring Security 专栏中有专门的博客说明,这里不具体解释了。

前后端跨域测试(前端相关配置)

由于集成了 Spring Security,登录后需要进行认证,认证完请求服务器端要认证的资源需要携带其认证的Cookie(也就是那个SessionID,表明已经认证了)。那么在前端使用 Axios 发送跨域请求的时候,就需要配置 axios.defaults.withCredentials = true 这是用于控制在发送跨域请求时是否携带身份凭证的(例如 Cookie、Http认证等),当然后端也需要配置。(当然不集成 Spring Security的话,是不需要配置这个的,因为什么登录认证是按你自己设定的程序走,不是由 Spring Security 去帮你管理了)

前端代码:

Axios 相关配置

在这里插入图片描述
测试代码

<script setup>
import { ref } from 'vue'
import axios from '../utils/index.js'
const content = ref('')

const userInfo = {
    "username" : "root",
    "password" : "123"
}
let flag = false
function login() {
    axios.post(`/api/auth/login`, userInfo).then(res => {
        console.log(res)
        content.value = JSON.stringify(res)
        flag = true
    }).catch(err=>{
        console.log(666999)
        console.log(err)
    })
}

function test(){
    axios.get(`/test`,{
        withCredentials: true,   //设置跨域的时候传递cookie,需要服务端的配合
    }).then(res=>{
        console.log(res)
        content.value = res
    }).catch(err=>{
        console.log(666)
        console.log(err)
    })
}

</script>

<template>
    <div>
        <button @click="login">登录</button><br><br>
        <button @click="test">发送测试请求</button><br><br>
        <div>
            <p>{{content}}</p>
        </div>
    </div>
</template>


测试结果

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢&#xff1f; 最近有不少新关注的读者&#xff0c;在后台问&#xff1a;大学学 Java 和 C 哪个好找工作&#xff0c;学前端好还是后端好&#xff0c;该学 Vue 还是 React。。。 仿佛看到了自己当年的模样&#xff0c;所以觉得有必要单独写一篇文章&a…

【数据结构与算法】02 栈 (栈的多重含义,静态、动态数组栈(顺序栈),链式栈,双端栈,括号匹配)

一、栈的多重含义1.1 硬件栈1.2 运行时栈1.3 软件栈1.4 技术栈1.5 TCP/IP协议栈 二、数据结构中的栈2.1 概念2.2 栈的操作2.3 数组栈&#xff08;顺序栈&#xff09;2.31 数组栈特性2.32 C语言实现▶ 静态数组栈▶ 动态数组栈 2.4链式栈2.41 链式栈特性2.42 C语言实现 三、进阶…

「展会前线」易天光通信盛装亮相2023越南通讯展会

2023年6月7日&#xff0c;在历经了忙碌有序的前期准备工作后&#xff0c;易天光通信销售团队带着满满的信心踏上了越南通讯展会之旅&#xff01; “千呼万唤始出来&#xff0c;犹抱琵琶半遮面”。2023年6月8日&#xff0c;各方期待已久的2023越南通讯展会在越南胡志明市正式开…

【新版】系统架构设计师 - 系统配置与性能评价

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 系统配置与性能评价考点摘要系统性能概述性能指标性能调整阿姆达尔解决方案性能评价方法 架构 - 系统配置与性能评价 考点摘要 性能指标&#xff08;★★&#xff09;阿姆达尔解决方案&#xff…

第Y3周:yolov5s.yaml文件解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 ✅本周任务&#xff1a;将yolov5s网络模型中第4层的C3*2修改为C3*1&#xff0c;第6层的C3*3修改为C3*2。 简单介绍&#xff1a; YOLOv5配置了…

MapBox实现框选查询,多边形范围查询

还是老规矩先来看效果&#xff1a; mapbox官方没有为我们提供框选查询的案例&#xff0c;所以这个功能需要我们自己写。在openlayers框架中是有一个矩形范围查询的例子&#xff0c;但是在maobox没有。 那么我们就来说一下如何来做这个效果吧&#xff0c;首先这个效果可以分为两…

6道常见hadoop面试题及答案解析

Q1.什么是Hadoop&#xff1f;   Hadoop是一个开源软件框架&#xff0c;用于存储大量数据&#xff0c;并发处理/查询在具有多个商用硬件&#xff08;即低成本硬件&#xff09;节点的集群上的那些数据。总之&#xff0c;Hadoop包括以下内容&#xff1a;   HDFS&#xff08;Ha…

红外人体感应灯单片机开发方案

近来&#xff0c;红外人体感应灯受到了居家人们关注和喜爱。为此&#xff0c;宇凡微推出了一款低成本红外人体感应灯单片机方案。红外人体感应灯可应用于走廊、床边、楼梯、衣柜等地方&#xff0c;提供柔和照明作用。人来即亮&#xff0c;人走即灭&#xff0c;不受强光影响睡眠…

位姿估计 | 空间目标位姿估计方法分类总结

目录 前言位姿估计方法分类一、传统位姿估计方法1. 基于特征的位姿估计2. 基于模型的位姿估计 二、深度学习位姿估计方法 总结 前言 本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容&#xff0c;希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章&a…

【C语言】整,浮点型数据存储,大小端。细节拉满!!

目录 一. 整型 1. C语言内置整型家族 类型的意义&#xff1a; 2.整型在内存如何存储的呢&#xff1f; 3. 原码&#xff0c;反码&#xff0c; 补码 原码 反码 补码 4. 当 整型遇上unsigned 会发生什么呢&#xff1f; 1. unsigned 与 signed 解析 2. printf 输出 有无…

【新版】系统架构设计师 - 信息安全技术基础知识

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 信息安全技术基础知识考点摘要信息安全基础知识信息安全系统的组成框架信息加密技术对称加密&#xff08;共享密钥&#xff09;非对称加密&#xff08;公开密钥&#xff09;信息摘要数字签名数字信…

IDEA安装教程2023

在本文中&#xff0c;我们将提供关于如何安装 IntelliJ IDEA 的详细步骤。如果您是初学者或只是想尝试一下 IDEA&#xff0c;我们建议您下载 Community 版。如果您需要更多高级功能&#xff0c;可以选择 Ultimate 版。 步骤一&#xff1a;下载 IntelliJ IDEA 首先&#xff0c;…

路漫漫其修远兮

其实不仅是专业&#xff0c;AI冲击波才刚刚开启&#xff0c;包括博客、自媒体作用也在大幅度下降呢。 很多人看过如下这幅图&#xff1a; 提示工程师确实是在当前大型语言模型不够完善的情况下&#xff0c;通过微调输入的方式来提高模型的性能。随着模型的迭代&#xff0c;这些…

功能测试如何转型自动化测试

在互联网行业&#xff0c;我们是那些被遗忘的技术人。 很多人都觉得&#xff0c;传统开发、运维才是技术含量的一个工作。 但是测试的入门门槛比较低&#xff0c;所做的事情相对有限&#xff0c; 这是我之前跟一些大型互联网软件测试负责人大牛们聊天的时候发现&#xff0c;…

lora,固定模特+固定衣服,怎么实现?

在电商行业&#xff0c;经常会有一个需求&#xff0c;就是把固定的衣服让模型穿上&#xff0c;然后拍很多的图片&#xff0c;放在商品主图、详情页、买家秀...... 人工智能发展到现在&#xff0c;最近aigc也挺热门的&#xff0c;有没有办法用“人工智能”算法就实现这个功能&a…

从1万到1亿需要多少个涨停板?(python)

如果本金只有1万元&#xff0c;需要多少个涨停板才可以到达一亿元呢&#xff1f; 亦或者&#xff0c;如果有一亿元本金&#xff0c;需要多少个跌停板才可以到达一万元。 注&#xff1a;涨停板&#xff08;10%&#xff09;&#xff0c;跌停板&#xff08;-10%&#xff09; 用到的…

在VSCode下利用PlateFormIO开发Arduino的MicroROS遇到的一些问题

文章目录 简介1.在第四节编译工程中&#xff0c;教程使用的vscode是有编译、上传的按钮的。但是我的没有。2.在【6.串口通信-接收实验】中&#xff0c;没有串行监视器&#xff08;Serial Monitor&#xff09;。3.关于trajectory_msgs/msg/joint_trajectory.hpp的相关问题4.关于…

PMP项目管理证书是什么?有什么用?

什么是PMP证书&#xff1f; PMP全称是Project Management Professional&#xff0c;中文全称叫项目管理专业人士资格认证&#xff0c;是由美国项目管理协会(PMI)发起&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试&#xff0c;目的是为了给项目管理人…

代码随想录|day13| 栈与队列part03 ● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

239. 滑动窗口最大值--------知识点&#xff1a;单调队列 链接&#xff1a;代码随想录 自己写的&#xff0c;报错&#xff1a; class DandiaoQueue{//一个栈或者队列&#xff0c;基本要有进栈出栈两种操作&#xff0c;这里再加上pop出最大值一种操作//底层是deque public:deque…

机器学习笔记 - 多实例学习(MIL)弱监督学习

一、多实例学习概述 多实例学习(MIL)是一种弱监督学习形式,其中训练实例被排列在称为袋的集合中,并为整个袋提供标签。这种方式越来越受到人们的关注,因为它自然适合各种问题,并允许利用弱标记数据。因此,它被应用于计算机视觉和文档分类等不同的应用领域。 多实例学习(…