配置 CORS
出于安全原因,浏览器禁止对位于当前源外部的资源进行 AJAX 调用。当使用浏览器发出的客户端 HTTP 请求时,您需要启用特定 HTTP 资源的可访问性。
从 2.6 版本开始,Spring Data REST 通过Spring 的 CORS 支持来支持跨源资源共享 (CORS)。
资源库接口 CORS 配置
您可以向资源库接口添加@CrossOrigin
注释以启用整个资源库的 CORS。默认情况下,@CrossOrigin
允许所有来源和 HTTP 方法。以下示例显示了一个跨源资源库接口定义
@CrossOrigin
interface PersonRepository extends CrudRepository<Person, Long> {}
在前面的示例中,为整个PersonRepository
启用了 CORS 支持。@CrossOrigin
提供属性来配置 CORS 支持,如下例所示
@CrossOrigin(origins = "http://domain2.example",
methods = { RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE },
maxAge = 3600)
interface PersonRepository extends CrudRepository<Person, Long> {}
前面的示例通过提供一个来源,限制为GET
、POST
和DELETE
方法,最大有效期为 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
配置结合使用。默认情况下,允许所有来源和GET
、HEAD
和POST
方法。
现有的 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);
}
}