配置 CORS

出于安全原因,浏览器禁止对位于当前来源之外的资源进行 AJAX 调用。在处理浏览器发出的客户端 HTTP 请求时,您需要启用特定 HTTP 资源才能访问。

从 2.6 版本开始,Spring Data REST 通过 跨域资源共享 (CORS) 支持 Spring 的 CORS

存储库接口 CORS 配置

您可以将 @CrossOrigin 注解添加到存储库接口,以启用整个存储库的 CORS。默认情况下,@CrossOrigin 允许所有来源和 HTTP 方法。以下示例显示了一个跨域存储库接口定义

@CrossOrigin
interface PersonRepository extends CrudRepository<Person, Long> {}

在上面的示例中,CORS 支持已为整个 PersonRepository 启用。@CrossOrigin 提供属性来配置 CORS 支持,如下例所示

@CrossOrigin(origins = "http://domain2.example",
  methods = { RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE },
  maxAge = 3600)
interface PersonRepository extends CrudRepository<Person, Long> {}

上面的示例通过提供一个来源、限制为 GETPOSTDELETE 方法,以及 3600 秒的有效期,为整个 PersonRepository 启用了 CORS 支持。

存储库 REST 控制器方法 CORS 配置

Spring Data REST 完全支持 Spring Web MVC 的控制器方法配置,用于共享存储库基本路径的自定义 REST 控制器,如下例所示

@RepositoryRestController
public class PersonController {

  @CrossOrigin(maxAge = 3600)
  @RequestMapping(path = "/people/xml/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
  public Person retrieve(@PathVariable Long id) {
    // …
  }
}
使用 @RepositoryRestController 注解的控制器会从其关联的存储库继承 @CrossOrigin 配置。

全局 CORS 配置

除了细粒度的基于注解的配置之外,您可能还想定义一些全局 CORS 配置。这类似于 Spring Web MVC 的 CORS 配置,但可以在 Spring Data REST 中声明,并与细粒度的 @CrossOrigin 配置结合使用。默认情况下,允许所有来源和 GETHEADPOST 方法。

现有的 Spring Web MVC CORS 配置不适用于 Spring Data REST。

以下示例设置允许的来源,添加 PUT 和 DELETE HTTP 方法,添加和公开一些标头,并设置一小时的最大年龄

@Component
public class SpringDataRestCustomization implements RepositoryRestConfigurer {

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {

    cors.addMapping("/person/**")
      .allowedOrigins("http://domain2.example")
      .allowedMethods("PUT", "DELETE")
      .allowedHeaders("header1", "header2", "header3")
      .exposedHeaders("header1", "header2")
      .allowCredentials(false).maxAge(3600);
  }
}