【SpringMvc 丨跨域】

news2024/11/22 22:01:14

Spring MVC 支持跨域处理(CORS)。

CORS

  • 简介
  • 处理
    • CORS 过滤器
    • CrossOrigin注解
    • java配置
    • xml配置

在这里插入图片描述

主页传送门:📀 传送

简介


   跨域是指在浏览器的同源策略下,不能执行其他网站的脚本。它是由浏览器的安全限制造成的,主要是为了保护用户的安全。如果您想要在不同域名下访问服务器上的资源,就需要使用跨域技术。跨域技术有很多种,比如 JSONP、CORS 等。

处理


    CORS 规范分为预检请求、简单请求和实际请求。要了解 CORS 的工作原理,可以阅读Cross-Origin Resource Sharing (CORS)等,或者查看规范了解更多详细信息。

    Spring MVC HandlerMapping 实现提供了对 CORS 的内置支持。成功将请求映射到处理程序后,HandlerMapping 实现检查给定请求和处理程序的 CORS 配置并采取进一步的操作。预检请求被直接处理,而简单和实际的 CORS 请求被拦截、验证,并设置了所需的 CORS 响应标头。

    为了启用跨源请求(即存在 Origin 标头并且与请求的主机不同),您需要有一些明确声明的 CORS 配置。如果未找到匹配的 CORS 配置,预检请求将被拒绝。没有 CORS 标头添加到简单和实际 CORS 请求的响应中,因此浏览器会拒绝它们。

    每个 HandlerMapping 都可以配置单独使用基于 URL 模式的 CorsConfiguration 映射。 在大多数情况下,应用程序使用 MVC Java 配置或 XML 命名空间来声明此类映射,这会导致将单个全局映射传递给所有 HandlerMapping 实例。

    可以将 HandlerMapping 级别的全局 CORS 配置与更细粒度的处理程序级别的 CORS 配置相结合。 例如,带注释的控制器可以使用类级或方法级的 @CrossOrigin 注释(其他处理程序可以实现 CorsConfigurationSource)。
结合全局和局部配置的规则通常是附加的⟩——例如,所有全局和所有局部起源。 对于那些只能接受单个值的属性,例如 allowCredentials 和 maxAge,局部覆盖全局值。

CORS 过滤器


   可以通过 Spring 内置的CorsFilter支持 CORS。

要配置过滤器,需将CorsConfigurationSource传递给它的构造函数,示例如下:

CorsConfiguration config = new CorsConfiguration();

// Possibly...
// config.applyPermitDefaultValues()

config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);

CorsFilter filter = new CorsFilter(source);

CrossOrigin注解


示例如下:

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

默认情况下,@CrossOrigin允许访问:

所有origin、所有 header、所有 Controller 方法映射到的 HTTP 方法
allowCredentials默认情况下不启用,因为它建立了一个信任级别,可以公开敏感的用户特定信息(例如 cookie 和 CSRF 令牌),并且只应在适当的情况下使用。启用时,必须将allowOrigins设置为一个或多个特定域(但不是特殊值"*"),或者allowOriginPatterns属性可用于匹配一组动态来源。

@CrossOrigin也支持类级别,并且被所有方法继承,示例如下:

@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

可以同时在类级别和方法级别上使用@CrossOrigin

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("https://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

java配置


想要在 MVC Java 配置中启用 CORS,可以使用CorsRegistry回调,示例如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/api/**")
            .allowedOrigins("https://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);

        // Add more mappings...
    }
}

xml配置


想要在 XML 命名空间中启用 CORS,可以使用mvc:cors元素,示例如下:

<mvc:cors>

    <mvc:mapping path="/api/**"
        allowed-origins="https://domain1.com, https://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="true"
        max-age="123" />

    <mvc:mapping path="/resources/**"
        allowed-origins="https://domain1.com" />

</mvc:cors>

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

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

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

相关文章

C++程序入门(helloworld.cpp编写)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

辅助驾驶功能开发-控制篇(01)-基于PID的横向控制算法

1 文档概述 本文档主要描述Lateral Control(横向控制)设计的功能要求、性能要求、算法推导。 2 功能要求 横向控制(Lateral Control)系统根据上层运动规划输出的期望路径、曲率等信息进行跟踪控制,以减少跟踪误差,同时保证车辆行驶平稳性和舒适性。 3 性能要求 控制系统应…

类和对象【基础概念】

全文目录 类的定义定义方式 类的访问限定符封装&#xff08;面向对象的三大特性之一&#xff09; 类对象模型类对象的存储方式类对象的大小计算 this指针this指针的特性**this指针可以为空吗&#xff1f;** 类的定义 在C中&#xff0c;C语言中的结构体struct中除了定义变量外还…

深度学习中softmax激活函数的用法

在深度学习中&#xff0c;“softmax” 是一种常用的激活函数&#xff0c;它主要用于多类别分类任务中的输出层。“Softmax” 是 “soft maximum” 的缩写&#xff0c;它通过将输入的实数向量转换为概率分布&#xff0c;用于表示相应类别的概率。

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …

Postman —— 配置环境变量

PostMan是一套比较方便的接口测试工具&#xff0c;但我们在使用过程中&#xff0c;可能会出现创建了API请求&#xff0c;但API的URL会随着服务器IP地址的变化而改变。 这样的情况下&#xff0c;如果每一个API都重新修改URL的话那将是非常的麻烦&#xff0c;所以PostMan中也提供…

【宝藏系列】几款好用的 Spring Boot 内置工具类

【宝藏系列】几款好用的 Spring Boot 内置工具类 文章目录 【宝藏系列】几款好用的 Spring Boot 内置工具类断言对象字符串集合文件资源IO 流反射AOP&#x1f349;文末推荐【深入浅出Java虚拟机】 断言 断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况 Assert 关键字…

ARM接口编程—IIC总线(exynos 4412平台)

IIC总线简介 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线 主要用于近距离、低速的芯片之间的通信&#xff1b;IIC总线有两根双向的信号线一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟的同步&#xff1b;IIC总线硬件结构简单&#xff…

Vim9用netrw快速打开文件

Vim9有一个自带的文件浏览器——netrw&#xff0c;它的功能很强大。今天我们给它添加两个快捷命令&#xff1a; Ctrl回车键&#xff0c;一次打开多个文件Alt回车键&#xff0c;打开文件后自动关闭目录窗口 一、修改vimrc文件&#xff1a; 操作路径&#xff1a;编辑》启动设置…

Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”怎么处理?(方法二)...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 先帝称之曰能&#xff0c;是以众议举宠为督。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子&#xff5e;】问了一…

SOME/IP

介绍 SOME/IP是一种汽车中间件解决方案&#xff0c;可用于控制消息。它从一开始就被设计为完美地适应不同尺寸和不同操作系统的设备。这包括小型设备&#xff0c;如相机、AUTOSAR 设备&#xff0c;以及头戴设备或远程通信设备。它还确保SOME/IP支持信息娱乐域以及车辆中其他域…

AmazonS3Exception: The specified key does not exist

使用S3近端包下载文件时&#xff0c;遇到这个问题&#xff0c;感觉像是设置的桶名称或者文件名没有找到&#xff0c;最后发现是桶名最后多了一个”/“&#xff0c;S3是根据桶名称文件名寻址&#xff0c;中间不需要添加/ 报错桶名&#xff1a;https://img-cdn.abc.com/eb3e9d5d…

机器学习(12)---梯度下降(含手写公式、推导过程和手写例题)

梯度下降 一、概述1.1 梯度下降的用途1.2 梯度下降公式 二、公式讲解2.1 推导过程2.2 例题 一、概述 1.1 梯度下降的用途 1. 使用线性回归的平方误差成本函数时&#xff0c;成本函数不会也永远不会有多个局部最小值。因为它是凸函数&#xff0c;只有单一的全局最小值。通俗地说…

工业机器人仿真参考

最近有一些朋友看到我做的关于Unity3d仿真机器人的项目&#xff0c;本次我在平台做以分享&#xff0c;希望的朋友或者有需要在此基础做开发的可以参考下。 开发工具&#xff1a; 下位机&#xff1a;Unity3D 上位机&#xff1a;Visual Studio 机械臂模型&#xff1a;TH6-QKM…

java word文档 转 html文件

用java将word转为html文档 1、简介2、添加依赖3、代码示例 1、简介 最近&#xff0c;因项目需要&#xff0c;需要对word文档进行解析拆分&#xff0c;感觉直接解析word有点麻烦&#xff0c;于是想到&#xff0c;先将word转为html文档&#xff0c;然后用jsoup解析html文件更方便…

Debian 12快速安装图解

文章目录 Debian 12安装图解创建虚拟机安装系统登录并用光盘离线安装sudo、curl解决Linux下sudo更改文件权限报错保存快照debain添加在线源(配置清华源)参考 Debian 12安装图解 Debian选择CD安装非常慢&#xff0c;本次安装选择DVD离线安装。 下载 https://www.debian.org/CD…

【遥感变化检测综述】—《多时相遥感影像的变化检测研究现状与展望》

作者&#xff1a;张 祖 勋&#xff0c;姜 慧 伟&#xff0c;庞 世 燕&#xff0c;胡 翔 云 论文连接&#xff1a;多时相遥感影像的变化检测研究现状与展望 — 张祖勋 1、内容概述 本文主要从几何和语义两个角度对变化检测方法进行了分析和归纳总结&#xff0c;重点分析了几何信…

SpringMVC之CRUD(增删改查)

SpringMVC之CRUD(增删改查) 数据库 # 创建表CREATE TABLE Student (sid INT PRIMARY KEY,sname VARCHAR(50),sage INT,spic VARCHAR(255));给student表插入数据 INSERT INTO Student (sid, sname, sage, spic) VALUES (1, John Do, 25, path/to/image1.jpg), (2, Jane Smith, …

宋浩概率论笔记(六)样本与统计量

参数估计的入门章节&#xff0c;为后面的参数估计与假设检验铺垫基础&#xff0c;难点在于背诵公式&#xff0c;此外对于统计量的理解一定要清晰——本质是多个随机变量复合而成的函数~

【Jenkins】pipeline流水线

【Jenkins】pipeline 【一】什么是pipeline&#xff1f;【二】pipeline任务【1】安装pipeline插件【2】创建pipeline任务&#xff08;1&#xff09;新增任务&#xff0c;选择流水线&#xff08;2&#xff09;Pipeline定义有两种方式&#xff1a; 【3】Pipeline Script 运行任务…