配置 CORS
出於安全原因,瀏覽器禁止對當前域之外的資源進行 AJAX 呼叫。在使用瀏覽器發出的客戶端 HTTP 請求時,您需要啟用對特定 HTTP 資源的訪問。
從 2.6 版本開始,Spring Data REST 支援透過 Spring 的 CORS 支援進行 跨域資源共享 (CORS)。
Repository 介面 CORS 配置
您可以將 @CrossOrigin
註解新增到您的 repository 介面,以啟用整個 repository 的 CORS。 預設情況下,@CrossOrigin
允許所有來源和 HTTP 方法。 以下示例顯示了一個跨域 repository 介面定義
@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 支援。
Repository REST 控制器方法 CORS 配置
Spring Data REST 完全支援在共享 repository 基本路徑的自定義 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) {
// …
}
}
使用 @RepositoryRestController 註解的控制器從其關聯的 repository 繼承 @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);
}
}