Spring 5.0.0.RC1 - CORS Support 【译文】
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请求是自动分发的,你不需要改变
DispatcherServletdispatchOptionsRequest的初始参数值;推荐的方式是使用它的默认值(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的细粒度配置。默认是允许所有的源跟GET,HEAD和POST方法。
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请求如何被处理:允许的源,头信息,方法等等。它可以以多种方式提供:
AbstractHandlerMapping#setCorsConfiguration()允许通过一个有一些CorsConfiguration实例的Map来指定映射到如/api/**的路径模式上。- 子类也可以通过重写
AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法来提供它们的CorsConfiguration。 - 为了给每个请求提供一个CorsConfiguration实例,处理器可以实现
CorsConfigurationSource接口(如ResourceHttpRequestHandler现在做的)。
3.5 基于过滤器的CORS支持
为了实现如Spring Security的基于过滤器的安全框架去支持CORS,或其他原生不支持CORS的类库,Spring框架也提供了CorsFilter。而不是使用@CrossOrigin或WebMvcConfigurer#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 【译文】的更多相关文章
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)
项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖 ...
- CORS support in Spring Framework--官方
原文地址:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework For security reasons, browse ...
- 时隔3年半Spring.NET 2.0终于正式Release了
一直很喜欢Spring.NET,不过2011年8月2日1.3.2正式release之后,再没有正式版本的release了. 直到4天前,Spring.NET 2.0 GA终于Release. http ...
- 1.Spring Framework 5.0 入门篇
1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring 在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...
- 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 ...
- 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 ...
- Spring Boot 2.0 版的开源项目云收藏来了!
给大家聊一聊云收藏从 Spring Boot 1.0 升级到 2.0 所踩的坑 先给大家晒一下云收藏的几个数据,作为一个 Spring Boot 的开源项目(https://github.com/cl ...
- 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator
前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...
随机推荐
- Android -- 贝塞尔二阶实现饿了么加入购物车效果
1,上周我们实现了简单的三阶贝塞尔曲线效果实例,今天是使用二阶贝塞尔曲线加动画实现的加入购物车效果,在码代码过程中出现了些问题,过一下和大家来探讨探讨,先看一下效果图 2,从上面的效果来看我们基本上可 ...
- RHEL7对比RHEL6的主要变化
RHEL7和RHEL6的主要变化 RHEL7和RHEL6的主要变化 RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo S ...
- USACO Section 1.1-1 Your Ride Is Here
USACO 1.1-1 Your Ride Is Here 你的飞碟在这儿 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支 ...
- 前端随手优化不完全篇-SEO篇
一代码优化概述 关于代码优化的知识是纯理论的知识,学习的很枯燥.在学到CSS时,不免遇到CSS+div进行代码优化的知 识,因此在网上看了一些关于这方面的知识,简单的整合一下,梳理自己所了解的代码优化 ...
- Linux--管道pipe
管道是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h> int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为 ...
- Linux - 函数的栈帧
栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储.为单个过程(函数调用)分配的那部分栈称为栈帧.栈帧其实是两个指针寄存器, 寄存器%ebp为帧 ...
- 【Windows 10 应用开发】输入模拟
---恢复内容开始--- Input Injection 直译为:输入注入.通俗的译法为:模拟输入.此注入行为可以模拟以下几种输入行为: 1.键盘按键. 2.鼠标. 3.触控. 4.书写笔输入. 5. ...
- webService基础知识--认识WebService
之前在找工作的时候,有面试官问到WebService,当时没有接触过,正好现在做的项目中有用到WebService,所以就趁着业余时间来学习了. 一.简介 先来看看百度百科对WebService的解释 ...
- session知识总结
0.什么是会话? - 简单理解:打开浏览器到关闭浏览器过程中的操作.请求. 1.Session是什么? - session是HttpSession的简称: - 用于保存会话状态: - 将会话状态保存在 ...
- 详解Java动态代理机制(二)----cglib实现动态代理
上篇文章的结尾我们介绍了普通的jdk实现动态代理的主要不足在于:它只能代理实现了接口的类,如果一个类没有继承于任何的接口,那么就不能代理该类,原因是我们动态生成的所有代理类都必须继承Proxy这个类, ...