跳到主要内容

配置 CORS

DeepSeek V3 中英对照 Configuring CORS

出于安全考虑,浏览器禁止对当前源之外的资源进行 AJAX 调用。在使用浏览器发出的客户端 HTTP 请求时,您可能希望启用特定的 HTTP 资源以供访问。

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

仓库接口 CORS 配置

你可以在你的仓库接口上添加 @CrossOrigin 注解,以启用整个仓库的 CORS。默认情况下,@CrossOrigin 允许所有来源和 HTTP 方法。以下示例展示了一个跨域仓库接口的定义:

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

在前面的示例中,整个 PersonRepository 都启用了 CORS 支持。@CrossOrigin 提供了用于配置 CORS 支持的属性,如下例所示:

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

前面的示例通过提供一个源,为整个 PersonRepository 启用了 CORS 支持,并将请求方法限制为 GETPOSTDELETE,最大有效期为 3600 秒。

仓库 REST 控制器方法 CORS 配置

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

@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) {
// …
}
}
java
备注

使用 @RepositoryRestController 注解的控制器会从其关联的仓库继承 @CrossOrigin 配置。

全局 CORS 配置

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

备注

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

以下示例设置了允许的源,添加了 PUTDELETE 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);
}
}
java