配置 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> {}

前面的示例透過提供一個來源,限制為 GETPOSTDELETE 方法,並將最大年齡設定為 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 配置相結合。 預設情況下,允許所有來源以及 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);
  }
}