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 格式是一个常见的需求。然而,由于各个开发人员的编码习惯和实现方式不同,导致导出代码风格不一。有的人使用第三方库,有的人则自定义实现。这种多样化不仅影响了代码的一致性…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
