20.1 简介

Cross-origin resource sharing(CORS) 是 大多数浏览器实现的规范,允许您以灵活的方式指定什么样的跨域请求被授权,而不是使用一些较不安全和不太强大的黑客工具(如IFRAME或JSONP)。

从Spring Framework 4.2开始,CORS支持开箱即用。. CORS 请求(including preflight ones with anmethod) 被自动调度到各种已注册的HandlerMappings. 由于CorsProcessor的实现(默认为DefaultCorsProcessor),为了根据您提供的CORS配置添加相关的CORS响应头(如Access-Control-Allow-Origin),它们处理CORS预检请求并拦截CORS简单实际的请求。

你如果想使用CORS ,可以在上增加@CrossOrigin注解. 默认情况下允许@RequestMapping注释中指定的所有起始点和HTTP方法:

对于整个 controller的CORS 的支持:

  1. @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
  2. @RestController
  3. @RequestMapping("/account")
  4. public class AccountController {
  5. @RequestMapping("/{id}")
  6. public Account retrieve(@PathVariable Long id) {
  7. // ...
  8. }
  9. @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
  10. // ...
  11. }
  12. }

您甚至可以同时使用控制器级和方法级的CORS配置; 然后,Spring将组合两个注释的属性以创建合并的CORS配置。

20.3 全局CORS 配置

除了细粒度,基于注释的配置,您也可能想要定义一些全局CORS配置。 这与使用过滤器类似,但可以在Spring MVC中声明,并结合细粒度的配置。 默认情况下,所有起始点和GET,HEAD和POST方法都是允许的。

配置全局CORS 如下所示:

  1. @Configuration
  2. @EnableWebMvc
  3. public class WebConfig extends WebMvcConfigurerAdapter {
  4. @Override
  5. public void addCorsMappings(CorsRegistry registry) {
  6. registry.addMapping("/**");
  7. }
  8. }

你也可以轻易的改变任意属性,以及仅将此CORS配置应用于特定路径模式:

20.3.2 XML 命名空间

  1. <mvc:cors>
  2. <mvc:mapping path="/**" />
  3. </mvc:cors>

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

CorsConfiguration 允许你定义CORS 请求怎样被处理: 允许origins, headers, methods, 如.:他可以使用以下几种方式处理:

  • 允许指定映射到路径模式(如/ api / **)的几个 CorsConfiguration实例的Map
  • 子类通过重载AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法提供自已的CorsConfiguration.
  • Handlers 通过实现 接口(像ResourceHttpRequestHandler现在做的一样) 对每个请求提供一个 实例.

20.5 基于 CORS 支持的过滤

为了支持基于过滤器的安全框架(如Spring Security)的CORS,或者与其他不支持本地CORS的库一起支持CORS,Spring Framework还提供了一个 . 而不是使用@CrossOrigin或WebMvcConfigurer#addCorsMappings(CorsRegistry),您需要注册一个自定义过滤器,如下所示:

  1. import org.springframework.web.filter.CorsFilter;
  2. public class MyCorsFilter extends CorsFilter {
  3. public MyCorsFilter() {
  4. super(configurationSource());
  5. }
  6. private static UrlBasedCorsConfigurationSource configurationSource() {
  7. CorsConfiguration config = new CorsConfiguration();
  8. config.setAllowCredentials(true);
  9. config.addAllowedOrigin("http://domain1.com");
  10. config.addAllowedHeader("*");
  11. config.addAllowedMethod("*");
  12. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  13. source.registerCorsConfiguration("/**", config);
  14. return source;
  15. }

您需要确保CorsFilter在其他过滤器之前过滤, 请参考 ,了解如何配置Spring Boot。