1、概述

在任何现代浏览器中,随着 HTML5 和 JS 客户端的出现,跨域资源共享 (CORS)是一项相关规范,这些客户端通过 REST API 使用数据。

通常,服务于 JS 的主机(例如 example.com)与服务于数据的主机(例如 api.example.com)是不同的。在这种情况下,CORS 可以实现跨域通信。

Spring 为 CORS 提供一流的支持,为在任何 Spring 或 Spring Boot Web 应用程序中配置它提供了一种简单而强大的方式。

2.控制器方法CORS配置

启用 CORS 很简单——只需添加注释@CrossOrigin

我们可以通过几种不同的方式实现这一点。

2.1。@CrossOrigin@RequestMapping-带注释的处理程序方法上

@RestController
@RequestMapping("/account")
public class AccountController {@CrossOrigin@RequestMapping(method = RequestMethod.GET, path = "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

在上面的示例中,我们只为retrieve()方法启用了 CORS 。我们可以看到我们没有为@CrossOrigin注解设置任何配置,所以它使用默认值:

  • 允许所有来源。
  • 允许的 HTTP 方法是在@RequestMapping注释中指定的方法(本例中为 GET)。
  • 预检响应的缓存时间 ( maxAge ) 为 30 分钟。

2.2. 控制器上的@CrossOrigin

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@RequestMapping(method = RequestMethod.GET, path = "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

这一次,我们在类级别添加了@CrossOrigin。因此,retrieve()remove()方法都启用了它。我们可以通过指定注释属性之一的值来自定义配置:originsmethodsallowedHeadersexposedHeadersallowCredentialsmaxAge

2.3. @CrossOrigin关于控制器和处理程序方法

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@CrossOrigin("http://example.com")@RequestMapping(method = RequestMethod.GET, "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

Spring 将结合来自两个注解的属性来创建一个合并的 CORS 配置。

在这里,两个方法的maxAge都是 3,600 秒,remove()方法将允许所有来源,retrieve()方法只允许来自http://example.com的来源。

3. 全局 CORS 配置

作为细粒度的基于注释的配置的替代方案,Spring 允许我们在控制器之外定义一些全局 CORS 配置。这类似于使用基于Filter的解决方案,但可以在 Spring MVC 中声明并结合细粒度的@CrossOrigin配置。

默认情况下,允许所有来源和 GET、HEAD 和 POST 方法。

3.1。Java配置

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**");}
}

上面的示例启用了从任何来源到应用程序中任何端点的 CORS 请求。

为了进一步锁定这一点,registry.addMapping方法返回一个CorsRegistration对象,我们可以将其用于其他配置。还有一个allowedOrigins方法可以让我们指定一个允许来源的数组。如果我们需要在运行时从外部源加载此数组,这将很有用。

此外,还有allowedMethodsallowedHeadersexposedHeadersmaxAge 和allowCredentials,我们可以使用它们来设置响应标头和自定义选项。

3.2. XML 命名空间

这个最小的 XML 配置在/**路径模式上启用了 CORS,其默认属性与 JavaConfig 相同:

<mvc:cors><mvc:mapping path="/**" />
</mvc:cors>

也可以使用自定义属性声明多个 CORS 映射:

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

4. 带有 Spring Security 的 CORS

如果我们在项目中使用 Spring Security,我们必须采取额外的步骤来确保它与 CORS 兼容。那是因为需要先处理 CORS。否则,Spring Security 将在请求到达 Spring MVC 之前拒绝该请求。

幸运的是,Spring Security 提供了一个开箱即用的解决方案:

@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors().and()...}}

这篇文章更详细地解释了它。

5. 它是如何工作的

CORS 请求会自动分派到各种已注册的HandlerMappings。它们处理 CORS 预检请求并使用CorsProcessor 实现(默认为DefaultCorsProcessor)拦截 CORS 简单和实际请求,以添加相关的 CORS 响应标头(例如Access-Control-Allow-Origin)。

CorsConfiguration允许我们指定应该如何处理 CORS 请求,包括允许的来源、标头和方法等。我们可以通过多种方式提供:

  • AbstractHandlerMapping#setCorsConfiguration()允许我们指定一个Map,其中几个CorsConfiguration映射到路径模式,例如/api/**
  • 子类可以通过覆盖AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法来提供自己的CorsConfiguration 。
  • 处理程序可以实现CorsConfigurationSource 接口(就像现在的ResourceHttpRequestHandler一样)为每个请求提供CorsConfiguration

6. 结论

在本文中,我们展示了 Spring 如何为在我们的应用程序中启用 CORS 提供支持。

我们从控制器的配置开始。我们看到我们只需要添加注解@CrossOrigin来启用 CORS 到一个特定的方法或整个控制器。

此外,我们了解到,为了在控制器之外控制 CORS 配置,我们可以使用 JavaConfig 或 XML 在配置文件中顺利执行此操作。

示例的完整源代码可在 GitHub 上获得。

springBoot CORS跨域注解@CrossOrigin相关推荐

  1. springBoot跨域注解@CrossOrigin

    Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它.所以springMVC的版本要在4.2或以上版本才支持@CrossOr ...

  2. CORS跨域与@crossorigin

    在这之前只是知道两者各自是什么,但却一直不清楚两者的关系,如今总结为下: CORS,全称是"跨域资源共享"(Cross-origin resource sharing) 它允许浏览 ...

  3. SpringBoot—CORS跨域问题详解和解决方案

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在前后端开发过程中,遇到过一种错误,类似于报错: Access to XMLHttpRequest at 'http://127 ...

  4. 【编程不良人】快速入门SpringBoot学习笔记06---RestFul、异常处理、CORS跨域、Jasypt加密

    1. RestFul 配套视频:[编程不良人]2021年SpringBoot最新最全教程_哔哩哔哩_bilibili 1.1 引言 REST全称是(Resources) Representationa ...

  5. 解决跨域问题@CrossOrigin注解的使用与CrossFilter对象的自定义

    一.跨域概念解析(@CrossOrigin) 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个 ...

  6. springboot解决跨域问题(Cors)

    springboot解决跨域问题(Cors) 参考文章: (1)springboot解决跨域问题(Cors) (2)https://www.cnblogs.com/owenma/p/8466856.h ...

  7. SpringBoot解决cors跨域问题

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间项目在集成sosoapi进行发布后,导致cors跨域接口无法测试访问,用如下代码解决即可 /*** 解决cors跨域问 ...

  8. Springboot 解决跨域的四种姿势

    Springboot 解决跨域的四种姿势 姿势一 实现WebMvcConfigurer#addCorsMappings的方法 import org.springframework.context.an ...

  9. Spring Boot 对CORS跨域访问的配置

    Springboot 对于跨域请求的支持有两种配置方式: 一:注解配置 @CrossOrigin注解可以实现对CORS的启用. @RequestMapping("/get_api" ...

最新文章

  1. 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux
  2. 基于Matlab的声波信号处理,基于声卡和Matlab平台的语音信号增强处理系统
  3. 传道、授业、解惑:俞士纶院长参加数据科学研究院第五届“院长接待日”
  4. 信息太多,时间太少: 大脑如何区分重要和不重要的事?
  5. Android中使用ContentProvider进行跨进程方法调用
  6. hihoCoder #1182 欧拉路·三 (变形)
  7. 发现了星星机这种打印工具,还挺不错...
  8. 15_Android中任务栈
  9. HashMap原理解析
  10. LeetCode(1051)——高度检查器(JavaScript)
  11. 不变子空间与线性变换的矩阵之间的关系
  12. 【阿里云播放器】AliyunPlayerTest.exe 播放mp4日志 win7
  13. stm32学习笔记——电容触摸按键的实现
  14. 给 TA 的一封匿名信-匿名信箱,一封来信,你的一封来信,一封Ta的来信,爆火的匿名信H5源码功能开发和分析,表白祝福道歉短信发送系统
  15. 天泉证道四句教与价值观
  16. 醉逍遥显示无法更新服务器,蜀门醉逍遥版本修改教程 (值好几千,俺心血).doc
  17. 湖南生物机电职院信息技术学院召开第一届思政工作会议
  18. css盒心形的代码过程,如何使用CSS和D3实现用文字组成的心形动画效果(附代码)...
  19. 组态王bitset用法_宇电AI系列仪表和组态王在产品检测装置中的应用
  20. linux用户密码文件为,Linux用户和密码文件格式详解

热门文章

  1. 编程式路由导航和withRouter
  2. FreeRTOS任务相关API函数---查询/改变某个任务的优先级+获取全部/某个任务状态信息
  3. python笔记本电脑安装不成功_笔记本安装python2.7程序的方法
  4. HP Pavillion15系列笔记本/其他系笔记本参考安装固态硬盘的过程
  5. 不安装Oracle客户端情况下使用PL/SQL 远程连接数据库
  6. python numpy库
  7. 逻辑为基、数企赋能(NO.18):矩形图评估与决策
  8. 前端面试题总结(含部分答案)
  9. 基于springboot的景区旅游信息管理系统(源代码+数据库)
  10. 手机QQ浏览器属于代理服务器吗?