配置 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);
}
}