Spring学习笔记_50——@CrossOrigin

news2024/11/26 9:20:48

Spring学习笔记_46——@InitBinder
Spring学习笔记_47——@RequestAttribute
Spring学习笔记_49——@ResponseBody

@CrossOrigin

文章目录

  • @CrossOrigin
      • 1. 介绍
      • 2. 场景
      • 3. 源码
      • 4. Demo
        • 4.1 的那个控制器或方法的CORS配置
        • 4.2 全局CORS配置
      • 5. 注意事项
      • 6. 补充
        • 同源策略(Same-Origin Policy)
        • 跨域问题的产生
        • 跨域请求的类型
        • 解决跨域问题的方法


1. 介绍

@CrossOrigin是Spring Framework中的一个注解,用于处理跨域资源共享(Cross-Origin Resource Sharing, CORS)问题。

2. 场景

@CrossOrigin注解的使用场景主要包括以下几种情况:

  1. Web组件或插件:如果你开发了一个Web组件或插件,它需要在其他网站上运行,并且需要与你的服务器通信,那么也需要处理跨域问题。
  2. 移动应用后端:移动应用通常与后端服务进行通信,如果移动应用和后端服务的域不同,也需要处理跨域请求。
  3. 本地开发:在本地开发环境中,开发者可能会使用不同的端口或本地服务器地址来模拟生产环境,这时本地开发服务器和前端应用之间也可能存在跨域问题。

3. 源码

/**
 * @author Russell Allen
 * @author Sebastien Deleuze
 * @author Sam Brannen
 * @author Ruslan Akhundov
 * @since 4.2
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
    // String数组类型的属性,用于指定可以跨域请求的源列表
	@AliasFor("origins")
	String[] value() default {};
    
    // String数组类型的属性,作用与value属性相同
	@AliasFor("value")
	String[] origins() default {};

    // 从Spring5.3版本开始提供
    // String数组类型的属性,可以用于设置多个跨域匹配规则。
	String[] originPatterns() default {};
    
    // String数组类型的属性,用于指定请求时允许跨域请求的请求头列表
	String[] allowedHeaders() default {};
    
    // String数组类型的属性,表示响应头中允许访问的消息头
	String[] exposedHeaders() default {};
    
    // RequestMethod数组类型的属性,表示允许跨域请求的HTTP方法
    // 默认情况下,允许请求的HTTP方法与@RequestMapping注解相同
	RequestMethod[] methods() default {};
    
    // String类型的属性,表示是否允许跨域发送Cookie信息
    // 使用此属性时,必须在value属性或者origins属性中明确指定具体的访问域
	String allowCredentials() default "";
    
    // long类型的属性,表示预处理响应的最大缓存时间,单位为秒
    // 默认值为1800秒,也就是30分钟
	long maxAge() default -1;
}

4. Demo

4.1 的那个控制器或方法的CORS配置
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin(origins = "http://xopencode.com") // 允许指定域名的前端应用访问
public class OpenApiController {

    @GetMapping("/api/data")
    public Data getData() {
        // 返回 API 数据
        return newData(...);
    }
}
4.2 全局CORS配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**") // 应用于 /api/ 下的所有路径
                .allowedOrigins("http://xopencode.com", "https://anotherdomain.com") // 允许多个域名
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的方法
                .allowedHeaders("*") // 允许的头
                .allowCredentials(true) // 允许携带凭证
                .maxAge(3600); // 预检请求的缓存时间
    }
}

5. 注意事项

  1. 版本要求:@CrossOrigin注解在Spring Framework 4.2及以上版本才支持。
  2. 安全性:使用@CrossOrigin注解时,需要谨慎配置允许的源(origins)和方法(methods),以避免潜在的安全风险。特别是当allowCredentials设置为true时,允许携带凭证(如Cookies),这会增加Web应用程序受攻击的概率。
  3. 注解失效问题:在使用@CrossOrigin注解时,需要确保@RequestMapping注解中声明了请求方式,即需要增加method=RequestMethod.XXX。

6. 补充

跨域问题(Cross-Origin Resource Sharing, CORS)是Web开发中经常遇到的一个问题,它涉及到浏览器安全策略中的同源策略(Same-Origin Policy)。为了理解跨域问题,我们首先需要了解什么是“同源”。

同源策略(Same-Origin Policy)

同源策略是一种浏览器安全策略,用于限制一个域的文档或脚本如何与另一个域的资源进行交互。它规定,如果两个页面的协议、端口(如果有指定)和主机名都相同,则这两个页面具有相同的源,可以互相访问对方的资源。例如,http://example.com/app/page1.htmlhttp://example.com/app/page2.html 是同源的,因为它们共享相同的协议(http)、主机名(example.com)和端口(默认端口80)。

跨域问题的产生

当浏览器中的一个页面尝试请求另一个不同源的资源时,就会产生跨域问题。例如,如果你的网页位于 http://example.com,并且它尝试通过AJAX请求从 http://anotherdomain.com 获取数据,这时浏览器会阻止这个请求,因为它违反了同源策略。

跨域请求的类型

跨域请求通常分为两类:

  1. 简单请求:这类请求只使用GET、HEAD或POST方法,并且POST请求的内容类型只能是text/plain、multipart/form-data或application/x-www-form-urlencoded。此外,请求中不能包含自定义的HTTP头部。
  2. 预检请求:对于不满足简单请求条件的请求,浏览器会首先发送一个OPTIONS请求到目标服务器,以检查服务器是否允许跨域请求。这个OPTIONS请求被称为“预检请求”(preflight request)。如果服务器允许跨域请求,并且满足特定的条件(如允许的方法、头部等),那么浏览器才会发送实际的请求。
解决跨域问题的方法
  1. JSONP:这是一种早期的跨域解决方案,它利用的是<script>标签不受同源策略限制的特点。但是,JSONP只支持GET请求,并且存在安全风险(如XSS攻击)。
  2. CORS(Cross-Origin Resource Sharing):这是现代浏览器支持的跨域解决方案。CORS允许服务器通过设置特定的HTTP头部来指示浏览器允许跨域请求。这些头部包括Access-Control-Allow-Origin(允许跨域请求的源)、Access-Control-Allow-Methods(允许的方法)等。
  3. 服务器代理:在某些情况下,如果无法修改目标服务器的CORS设置,可以通过设置一个中间服务器(代理服务器)来转发请求。这样,前端页面就可以向代理服务器发送请求,然后由代理服务器向目标服务器发送请求并返回结果。
  4. WebSocket:WebSocket是一种新的通信协议,它允许在用户的浏览器和服务器之间进行双向通信。WebSocket不受同源策略的限制,因此可以用于跨域通信。但是,WebSocket主要用于实时通信场景,而不是普通的HTTP请求。

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

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

相关文章

Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file

Move 共学活动&#xff1a;快速上手 Move 开发 为了帮助更多开发者快速了解和掌握 Move 编程语言&#xff0c;Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台&#xff0c;带领大家一步步熟悉 Move 语言&#…

【C语言】野指针问题详解及防范方法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;什么是野指针&#xff1f;&#x1f4af;未初始化的指针代码示例问题分析解决方法 &#x1f4af;指针越界访问代码示例问题分析解决方法 &#x1f4af;指向已释放内存的…

关于如何在k8s中搭建一个nsfw黄图鉴定模型

随着现在应用内图片越来越多&#xff0c;安全审查也是必不可少的一个操作了 下面手把手教你如何将huggingface中的黄图检测模型部署到自己的服务器上去 1.找到对应的模型 nsfw_image_detection 2.在本地先验证如何使用 首先安装transformers python库 pip install transform…

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …

信息安全实验--密码学实验工具:CrypTool

1. CrypTool介绍&#x1f4ad; CrypTool 1的开源教育工具&#xff0c;用于密码学研究。通过CrypTool 1&#xff0c;可以实现加密和解密操作&#xff0c;数字签名。CrypTool1和2有很多区别的。 来源于&#xff1a;网络安全快速入门5-密码学及密码破解工具CrypTool实战_百度知道…

服务器数据恢复—raid5阵列+LVM+VXFS数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌MSA2000FC存储中有一组由7块盘组建的RAID5阵列&#xff0c;另外还有1块硬盘作为热备盘使用。 基于RAID5阵列划分的几个LUN分配给小机使用&#xff0c;存储空间通过LVM管理&#xff0c;重要数据为Oracle数据库及OA服务端。 服务器存储…

基于微信小程序的酒店客房管理系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、员工、普通用户功能模块&#xff1a;员工管理、用户管理、客房管理、预订管理、商品管理、评价管理、续订管理、订单管理等技术选型&#xff1a;SSM&#xff0c;vue&#xff0c;uniapp等测试环境&#xff1a;idea2024&#xff0c;jdk1…

学习Zookeeper

Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …

java基础知识(Math类)

引入&#xff1a;Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根 import java.util.Math 1.abs绝对值 int abs Math.abs(-9); 2.pow求幂 double pow Math.pow(2,4); 3.向上取整 double ceil Math.ceil(3.9);//ceil 4 4.向下取整 dou…

【AIGC】大模型面试高频考点-RAG中Embedding模型选型

【AIGC】大模型面试高频考点-RAG中Embedding模型选型 &#xff08;一&#xff09;MTEB排行榜英文模型排名&#xff1a;1、bge-en-icl2、stella_en_1.5B_v53、SFR-Embedding-2_R4、gte-Qwen2-7B-instruct5、stella_en_400M_v56、bge-multilingual-gemma27、NV-Embed-v18、voyage…

学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

SAP ME2L/ME2M/ME3M报表增强添加字段

SAP ME2L/ME2M/ME3M报表增强添加字段&#xff08;包含&#xff1a;LMEREPI02、SE18:ES_BADI_ME_REPORTING&#xff09; ME2L、ME2M、ME3M这三个报表的字段增强&#xff0c;核心点都在同一个结构里 SE11:MEREP_OUTTAB_PURCHDOC 在这里加字段&#xff0c;如果要加的字段是EKKO、…

dubbo-go框架介绍

框架介绍 什么是 dubbo-go Dubbo-go 是 Apache Dubbo 的 go 语言实现&#xff0c;它完全遵循 Apache Dubbo 设计原则与目标&#xff0c;是 go 语言领域的一款优秀微服务开发框架。dubbo-go 提供&#xff1a; API 与 RPC 协议&#xff1a;帮助解决组件之间的 RPC 通信问题&am…

不只是请求和响应:使用Fiddler抓包URL和Method全指南(中)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5502 &#x1f649;在(上)篇博客中&#xf…

Linux操作系统学习---初识环境变量

目录 ​编辑 环境变量的概念&#xff1a; 小插曲&#xff1a;main函数的第一、二个参数 获取环境变量信息&#xff1a; 1.main函数的第三个参数 2.查看单个环境变量 3.c语言库函数getenv() 和环境变量相关的操作指令&#xff1a; 1.export---导出环境变量&#xff1a; 2.unse…

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

mysql索引失效的五种情况

第一种 违反最左前缀法则 这个是针对联合索引的。 假设有个tb_seller表&#xff0c;现在给三个字段建立联合索引&#xff0c;建立的时候字段顺序不可随便设置&#xff0c;字段顺序&#xff1a; name, status, address。下图Seq_in_index对应的是联合索引顺序。 判断索引失效用…

H3C OSPF 多区域实验

目录 前言 实验拓扑 实验需求 实验解析 路由器配置 测试 前言 此篇文章为 OSPF多区域试验&#xff0c;建议先食用OSPF单区域实验&#xff0c;理解实验原理 学习基本配置&#xff0c;再来使用此篇&#xff0c;效果更佳&#xff01;&#xff08;当然如果你已经了解原理与基…

算法 Java实现

一.查找算法 1.分块查找 二.排序算法 1.冒泡排序

优先算法 —— 双指针系列 - 快乐数

1. 快乐数 题目链接&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/description/ 2. 题目解析 示例1&#xff1a; 示例2&#xff1a; 3. 算法原理 两种情况&#xff1a;我们可以把两种情况都看作为循环&#xff0…