springboot中有哪些方式可以解决跨域问题
文章目录
- 什么是跨域
- 解决方案
- @CrossOrigin注解
- 实现WebMvcConfigurer接口
- CorsFilter过滤器
- 如何选择?
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
Talk is cheap , 先看代码。
在Springboot项目中新建一个测试接口,端口号默认8080:
@RestController
@RequestMapping("test")
public class TestController {@GetMapping("1")public String test1(){System.out.println("1");return "111111111";}
}
再新建一个HTML页面,在页面内访问上述接口:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script>function cors() {$.get('http://localhost:9090/test/1', function(data) {alert(data)});}</script>
</head>
<body>
<button onclick="cors()">CORS</button>
</body>
</html>
从Idea中打开,并在浏览器访问, 点击CORS按钮,你猜会发生什么?


是的,你猜对了,浏览器控制台会出现如下提示,就是告诉你跨域了。
cors.html:1 Access to XMLHttpRequest at 'http://localhost:9090/test/1' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
什么是跨域
介绍跨域之前要介绍一下同源策略,什么是同源策略呢?
同源策略是浏览器的一种安全策略,用于限制一个网页文档或脚本如何与其他源的资源进行交互。同源策略的核心思想是:网页文档或脚本只能与加载它们的同一个源下的资源进行交互,而不能与不同源的资源直接进行数据交换。
同源策略有如下3点要求:
- 协议相同:两个页面的协议必须相同(如都是
https)。 - 域名相同:两个页面的域名(包括子域名)必须相同。
- 端口相同:如果指定了端口号,两个页面的端口号必须相同。
举个例子:
- 如果页面 A 加载自
https://www.example.com,那么它只能与https://www.example.com下的资源进行交互,比如可以通过 JavaScript 发送 AJAX 请求。 - 页面 A 不能直接与
https://api.example.net或http://sub.example.com这些不同源的资源进行交互,因为它们的协议、域名或端口不同。
为什么要有同源策略?
如果没有同源策略,网站A就可以访问网站B的Cookie,Cookie中可能会存在用户的token或者其他敏感信息,通过这些敏感信息可能会发送一些伪请求到网站B,从而窃取一些数据。这就相当于你们家什么安全措施都不做,别人想进就进,那可不丢家吗。
跨域或者叫跨域资源共享(Cross-origin resource sharing, CORS) :当浏览器访问不同源的网站时,就会产生跨域问题。
为了让不同源之间的能够访问,就要解决跨域问题。
解决方案
在Springboot中通常有3种方式:
- 使用**@CrossOrigin注解**
- 实现WebMvcConfigurer接口
- 使用CorsFilter过滤器
@CrossOrigin注解
@CrossOrigin注解可以作用于类或者方法级别,当作用于类级别时,表示该类中所有方法都可以实现跨域访问。当应用于方法级别时,表示该方法可以实现跨域访问。
举个例子:
@RestController
@RequestMapping("test")
public class TestController {@CrossOrigin(origins = "http://localhost:63342") // 仅允许来自localhost:63342的请求跨域@GetMapping("1")public String test1(){System.out.println("1");return "111111111";}
}
@CrossOrigin注解有如下属性:
-
origins:允许访问的源列表。可以指定一个或多个 URL,或者使用*来允许所有源。注意,如果allowCredentials设置为true,则不能使用*,必须明确指定源。 -
methods:允许的方法列表,如GET、POST、PUT等。同样,也可以使用*来允许所有方法。 -
allowedHeaders:请求中允许的头列表。使用*可以允许所有头。 -
exposedHeaders:响应中暴露给客户端的头列表。这些头会被添加到Access-Control-Expose-Headers响应头中。 -
allowCredentials:是否允许发送 cookies。如果设置为true,浏览器将允许前端 JavaScript 访问响应中设置的 Cookies 和 HTTP 认证信息。这个选项和配置的域建立了很高的信任度,不过呢,也因为暴露了像 Cookies 和 CSRF 令牌这类敏感的用户特定信息,增加了应用程序被攻击的可能性。 当allowCredentials为true时,origins不能设置为*。 -
maxAge:预检请求的结果可以被缓存多久(以秒为单位)。这可以减少不必要的预检请求,提高性能。 -
originPatterns:Spring 5.3 版本开始新增的属性。允许使用通配符模式来定义允许访问的域名。比如,originPatterns={https://*.domain1.com},就是可以匹配以domain1.com结尾的网站。 -
allowPrivateNetwork:Spring 5.3.32 版本开始新增的属性。是否允许来自私有网络地址的请求通过跨域请求。
实现WebMvcConfigurer接口
WebMvcConfigurer接口是Spring MVC的一个配置接口,通过它可以自定义配置Spring MVC的行为,包括但不限于视图解析器、静态资源处理、消息转换器、拦截器、跨域等。
只要实现WebMvcConfigurer接口重写addCorsMappings方法即可。
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 对所有路径生效.allowedOriginPatterns("*") // 允许源地址的通配符
// .allowedOrigins("http://localhost:63342") // 允许源地址http://localhost:63342.allowCredentials(true) // 是否允许发送Cookie.allowedMethods("GET", "POST", "DELETE", "PUT") // 允许的请求方法.allowedHeaders("*"); // 允许的请求头}
}
CorsRegistry 是一个用于配置跨域的工具类。
CorsRegistry 类中的属性和@CrossOrigin注解中的跨域属性基本相同,作用也是一样的,这里不做过多介绍。
CorsFilter过滤器
CorsFilter 过滤器,见名知意就是一个用于处理跨域请求的过滤器。具体用法如下:
@Configuration
public class CorsFilterConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("http://localhost:63342");config.setAllowCredentials(true);config.addAllowedMethod("*");config.addAllowedHeader("*");
// config.addAllowedOriginPattern("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();// 匹配路径source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}
看它的用法是不是特别熟悉,是的,没错,它也和@CrossOrigin注解中的跨域属性基本相同。
如何选择?
既然@CrossOrigin注解、WebMvcConfigurer配置类、CorsFilter过滤器都能解决跨域问题,那使用哪个好呢?
先来看一下它们之间的区别:
WebMvcConfigurer:用于全局配置CORS策略,适合需要全局配置的场景。CorsFilter:可以精细配置CORS策略,并适用于对不同路径设置不同的CORS策略。@CrossOrigin:用于局部配置,非常适合单个Controller或方法需要不同的CORS策略的情况。
在实际项目中,可以根据需求选择合适的方式来解决跨域问题。如果项目中的跨域需求较为统一,且希望有一个全局性的解决方案,那么WebMvcConfigurer可能是一个不错的选择。如果需要对跨域请求进行更细粒度的控制,或者项目中的跨域需求较为分散,那么CorsFilter或@CrossOrigin可能更适合。
所以,没有好不好,只有合不合适,合适你的就是最好的。
以上在Springboot中解决跨域的三种方式其实都是对CorsConfiguration跨域配置类的封装,感兴趣的可以看一看CorsConfiguration跨域配置类。
相关文章:
springboot中有哪些方式可以解决跨域问题
文章目录 什么是跨域解决方案CrossOrigin注解实现WebMvcConfigurer接口CorsFilter过滤器如何选择? 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 Talk is cheap ࿰…...
Temporal Dynamic Quantization for Diffusion Models阅读
文章目录 AbstractIntroductionBackgrounds and Related Works2.1 扩散模型2.2 量化2.3 量化感知训练和训练后量化 TemporalDynamic Quantization3.1 量化方法3.2 扩散模型量化的挑战3.3 TDQ模块的实现3.4 工程细节时间步的频率编码TDQ模块的初始化 Experimental SetupResults5…...
828华为云征文|华为云Flexus X实例性能实测:速度与稳定性的完美结合
828华为云征文|华为云Flexus X实例性能实测:速度与稳定性的完美结合 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、实践环境介绍2.1 本次实践环境规划2.2 本次实践介绍 …...
【PyTorch】图像分割
图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割:少量超像素代替大量像素,常用于图像预处理语义分割:逐像素分类,无法区分个体实例分割:对个体目标进行分割全景分割:…...
如何快速建立自己的异地互联的远程视频监控系统,通过web浏览器可以直接查看公网上的监控视频(上)
目录 一、需求 二、方案 2.1、计划方案 2.2、实施准备 2.2.1所需配置的产品和服务 2.2.1.1云主机 (1)选择云平台 (2)配置云服务器 2.2.2.2视频监控平台软件 (1)视频监控平台软件 (2&am…...
实验2思科网院项目2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习
实践练习 2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习physical-mode 实验拓扑 相关设备配置 实验目标: 第 1 部分:构建网络并配置设备的基本设置 第 2 部分:配置和验证单区域 OSPFv2 的基本部署 第 3 部分:优化和验…...
Nginx实战经验分享:从小白到专家的成长历程!
目录 一、Nginx概述1、Nginx简介(1)事件驱动模型(2)异步处理(3)模块化设计(4)高性能(5)反向代理(6)负载均衡(7)…...
从画质设置看游戏引擎(其一)
前往我的博客,获取无广告,更好的阅读体验 1. 抗锯齿(Anti-Aliasing) 1.1 锯齿问题的起因 在三维模型的世界中,模型是连续的,但是屏幕像素是不连续,是离散的; 即当一个圆形显示在显…...
#git 问题failed to resolve head as a valid ref
问题如下: 解决方法: 1、运行 git fsck --full 可以查看具体error信息,一般都是head索引问题 2、.git\refs\heads\xxx(当前分支)txt编辑器打开显示乱码,而不是hash编码 3、在.git\logs\refs\heads\xxx&a…...
YOLOv11,地瓜RDK X5开发板,TROS端到端140FPS!
YOLOv11 Detect YOLOv11 Detect YOLO介绍性能数据 (简要) RDK X5 & RDK X5 Module 模型下载地址输入输出数据公版处理流程优化处理流程步骤参考 环境、项目准备导出为onnxPTQ方案量化转化使用hb_perf命令对bin模型进行可视化, hrt_model_exec命令检查bin模型的输入输出情况…...
Python精选200Tips:181-182
针对图像的经典卷积网络结构进化史及可视化 针对图像的经典卷积网络结构进化史及可视化(续)P181--MobileNet【2017】模型结构及创新性说明模型结构代码MobileNet V1版本MobileNet V2版本MobileNet V3 版本Small版本Large版本 P182--EfficientNet【2019】…...
SpringCloud 配置 feign.hystrix.enabled: true 不生效
SpringCloud 配置 feign.hystrix.enabled: true 不生效的原因 feign 启用 hystrix feign 默认没有启用 hystrix,添加配置,启用 hystrix feign.hystrix.enabledtrue application.yml 添加配置 feign:hystrix:enabled: true启用 hystrix 后,访…...
9.24-k8s服务发布
Ingress 使用域名发布 K8S 服务 部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 ki…...
UI设计师面试整理-作品集展示
在UI设计师的面试中,作品集展示是非常关键的一环。它不仅展示了你的设计技能和风格,也让面试官了解你的设计思维和解决问题的能力。下面是如何有效地准备和展示你的作品集的建议: 1. 选择合适的项目 ● 多样性:选择能展示你在不同领域或平台上的设计能力的项目。确保作品集…...
CMU 10423 Generative AI:lec10(few-shot、提示工程、上下文学习)
文章目录 1 概述2 摘录2.1 zero-shot 和 few-shot一、Zero-shot Learning(零样本学习)特点:工作原理:优点:缺点: 二、Few-shot Learning(少样本学习)特点:工作原理&#…...
做数据抓取工作要如何选择ip池
选择合适的IP池对于数据抓取工作至关重要。一个优质的IP池可以提高抓取的效率和成功率,同时减少被目标网站封禁的风险。以下是选择IP池时需要考虑的一些关键因素: 1. IP类型 住宅IP:住宅IP通常来自真实用户,难以被识别为代理。它…...
防止电脑电池老化,禁止usb或者ac接口调试时充电
控制android系统,开发者模式,开启和禁止充电 连接 Android 手机到电脑的 USB 端口。 下载并安装 Android Debug Bridge (ADB) 工具[1]。 USB: 在命令行中输入 adb shell dumpsys battery set usb 0,以禁止 USB 充电。 在命令…...
智权半导体/SmartDV力助高速发展的中国RISC-V CPU IP厂商走上高质量发展之道
作者:Karthik Gopal SmartDV Technologies亚洲区总经理 智权半导体科技(厦门)有限公司总经理 进入2024年,全球RISC-V社群在技术和应用两个方向上都在加快发展,中国国内的RISC-V CPU IP提供商也在内核性能和应用扩展…...
利用vue-capper封装一个可以函数式调用图片裁剪组件
1. 效果 const cropData await wqCrop({prop:{img,autoCrop: true, // 是否开启截图框maxImgSize: 600,autoCropWidth: 30,canMove: true, // 图片是否可移动canMoveBox: true, // 截图框是否可移动fixedBox: false, // 截图框是否固定}});console.log(cropData);使用wqCrop会…...
在系统开发中提升 Excel 数据导出一致性与可维护性的统一规范与最佳实践
背景: 在系统开发过程中,数据导出为 Excel 格式是一个常见的需求。然而,由于各个开发人员的编码习惯和实现方式不同,导致导出代码风格不一。有的人使用第三方库,有的人则自定义实现。这种多样化不仅影响了代码的一致性…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
