3 CORS支持

3.1 介绍

出于安全考虑,浏览器禁止对当前源之外的资源进行AJAX调用。例如,当你在一个标签页检查你的银行账户时,你可以在另一个标签页打开evil.com的网站。在evil.com中的脚本不能使用你的凭据来通过AJAX请求访问你的银行API(例如,从你的银行取款!)。

跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准大部分的浏览器都实现了这个标准来让你可以灵活地指定什么样的跨域请求是被授权的,而不用使用IFRAME或JSONP这些不太安全和功能不强的黑客技术。

从Spring Framework 4.2起,CORS就支持开箱即用。CORS请求(包括一个预检请求OPTIONS方法)自动分发到各个注册的HandlerMapping中。由于CorsProcessor的实现(默认是DefaultCorsProcessor),它们处理CORS预检请求,并拦截CORS的简单而实际请求,以便根据你提供的CORS配置添加相关的CORS响应头(如Access-Control-Allow-Origin)。

由于CORS请求是自动分发的,你不需要改变DispatcherServlet dispatchOptionsRequest的初始参数值;推荐的方式是使用它的默认值(false)。

3.2 控制器方法CORS配置

你可以在你的@RequestMapping注解处理方法上添加一个@CrossOrigin注解来开启CORS。默认@CrossOrigin允许所有的源和在@RequestMapping注解上指定的HTTP方法:

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

它也可以在所有的控制器上开启CORS:

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

在上面的例子中,对retrieve()remove()处理方法都开启了CORS支持,你也可以看到你可以通过@CrossOrigin的属性来配置CORS。

你甚至可以在控制器级别和方法级别进行CORS配置。Spring将组合两个注解的属性来创建一个组合的CORS配置。

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

3.3 全局CORS配置

除了基于注解的细粒度配置,你也可能想要定义一些全局的CORS配置。这个与使用过滤器类似,但是可以在Spring MVC中声明跟加上@CrossOrigin的细粒度配置。默认是允许所有的源跟GETHEADPOST方法。

3.3.1 JavaConfig

整个应用开启CORS的例子如下:

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

你可以轻松地改变任何属性,也可以将CORS配置指定到特殊的路径模式:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
}

3.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>

3.4 高级定制

CorsConfiguration允许你指定CORS请求如何被处理:允许的源,头信息,方法等等。它可以以多种方式提供:

3.5 基于过滤器的CORS支持

为了实现如Spring Security的基于过滤器的安全框架去支持CORS,或其他原生不支持CORS的类库,Spring框架也提供了CorsFilter。而不是使用@CrossOriginWebMvcConfigurer#addCorsMappings(CorsRegistry),你需要注册一个如下的自定义过滤器:

import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter; public class MyCorsFilter extends CorsFilter { public MyCorsFilter() {
super(configurationSource());
} private static UrlBasedCorsConfigurationSource configurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}

你需要确保CorsFilter在其他过滤器之前,相应地看一下关于如何配置Spring Boot的这篇博客


【译者注】

原文:http://docs.spring.io/spring/docs/5.0.0.RC1/spring-framework-reference/web.html#cors

看这篇文章之前,建议看一下阮一峰写的关于CORS的文章

欢迎批评指正

Spring 5.0.0.RC1 - CORS Support 【译文】的更多相关文章

  1. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  2. springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)

    项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖  ...

  3. CORS support in Spring Framework--官方

    原文地址:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework For security reasons, browse ...

  4. 时隔3年半Spring.NET 2.0终于正式Release了

    一直很喜欢Spring.NET,不过2011年8月2日1.3.2正式release之后,再没有正式版本的release了. 直到4天前,Spring.NET 2.0 GA终于Release. http ...

  5. 1.Spring Framework 5.0 入门篇

    1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring  在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...

  6. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'

    七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...

  7. Quick Guide to Microservices with Spring Boot 2.0, Eureka and Spring Cloud

    https://piotrminkowski.wordpress.com/2018/04/26/quick-guide-to-microservices-with-spring-boot-2-0-eu ...

  8. Spring Boot 2.0 版的开源项目云收藏来了!

    给大家聊一聊云收藏从 Spring Boot 1.0 升级到 2.0 所踩的坑 先给大家晒一下云收藏的几个数据,作为一个 Spring Boot 的开源项目(https://github.com/cl ...

  9. 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator

    前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...

随机推荐

  1. window server2012 许可证过期

    研发的服务器装得windows server 2012 Standard ,许可证只有半年使用时间,过期了老是自动关机,于是在网上找了下,最终找了个可以用的方法,记录下,留用 步骤: 1.cmd命令打 ...

  2. js 模板引擎

    template = document.querySelector('#template').innerHTML, result = document.querySelector('.result') ...

  3. Java高级特性(基础)

    1.StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对String的改变都 会引发新的String对象的生成:StringBuf ...

  4. 打印Fibonacci数列方法汇总(前20项,每行5个)

    NO.1 迭代法 标签:通俗.易懂 思路:先打印第一项.再在循环里面执行fib=fib1+fib2,把fib2赋给fib1,把fib赋给fib2,每行5个可使用if函数(循环次数对5取余). #inc ...

  5. 关于centos 7 systemctl自定义服务笔记

    通过添加 Restart=always RestartSec=2s StartLimitBurst=10 实现systemctl服务崩溃自动重启

  6. UEditor使用------图片上传与springMVC集成 完整实例

    UEditor是一个很强大的在线编辑软件 ,首先讲一下 基本的配置使用 ,如果已经会的同学可以直接跳过此节 ,今天篇文章重点说图片上传; 一  富文本的初始化使用: 1 首先将UEditor从官网下载 ...

  7. Extjs6官方文档译文——应用架构简介(MVC,MVVM)

    应用架构简介 Extjs 同时提供对于MVC和MVVM应用架构的支持.这两个架构方式共享某些概念,而且都旨在沿着逻辑层面划分应用程序代码.每种方法在选择如何划分应用组件上都有其各自的优势. 本指南的目 ...

  8. 图解WebGL&Three.js工作原理

    “哥,你又来啦?”“是啊,我随便逛逛.”“别介啊……给我20分钟,成不?”“5分钟吧,我很忙的.”“不行,20分钟,不然我真很难跟你讲清楚.”“好吧……”“行,那进来吧,咱好好聊聊” 一.我们讲什么? ...

  9. nginx下的几种包管理器

    一般来说著名的linux系统基本上分两大类:   1.RedHat系列:Redhat.Centos.Fedora等   2.Debian系列:Debian.Ubuntu等   RedHat系列: 1 ...

  10. Linq 查询与普通查询的区别

    普通:select * --1 from User(表名) as u --2 where u.Name like '%s%' --3 Linq : from User(表名) as u --1 whe ...