Web.xmlをJava構成に移植した後、次の問題が発生します
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
いくつかのSpringの参照に基づいて、次の試みが試みられました。
@Configuration
@ComponentScan(basePackageClasses = AppConfig.class, useDefaultFilters = false, includeFilters = {
@Filter(org.springframework.stereotype.Controller.class) })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").allowedOrigins("*").allowedMethods("GET", "POST", "OPTIONS", "PUT")
.allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
"Access-Control-Request-Headers")
.exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
.allowCredentials(true).maxAge(3600);
}
}
選択された値は、有効なweb.xmlフィルターから取得されました。
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.Apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param> </filter> <filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring Java構成アプローチがweb.xmlファイルのように機能しない理由はありますか?
addCorsMappings
メソッドでCorsMappingをregistry.addMapping("/*")
からregistry.addMapping("/**")
に変更します。
このSpring CORS Documentation をご覧ください。
ドキュメント -から
アプリケーション全体でCORSを有効にするには、次のように簡単です。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
プロパティは簡単に変更でき、このCORS設定を特定のパスパターンにのみ適用できます。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
}
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
}
コントローラー全体でCORSを有効にするには-
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
コントローラーレベルとメソッドレベルの両方のCORS構成を使用することもできます。その後、Springは両方の注釈の属性を組み合わせて、マージされたCORS構成を作成します。
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://domain2.com")
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
役立つヒント-Springデータレストを使用している場合は、別のアプローチが必要です。
@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.getCorsRegistry().addMapping("/**")
.allowedOrigins("http://localhost:9000");
}
}
同じ問題があり、以下のようにSpringのXML構成を使用して解決しました。
これをコンテキストxmlファイルに追加します
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-headers="Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Authorization, X-Requested-With, requestId, Correlation-Id"
allowed-methods="GET, PUT, POST, DELETE"/>
</mvc:cors>
Spring Security ver> = 4.2を使用している場合、Apacheを含める代わりに、Spring Securityのネイティブサポートを使用できます。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
上記の例は、Spring ブログ投稿 からコピーされたものです。ここでは、コントローラーでCORSを構成する方法、特定のコントローラーメソッドなどに関する情報も見つけることができます。さらに、XML構成の例もあります。 Spring Bootの統合。
Omkarの答えは非常に包括的なものです。
ただし、グローバル構成部分の一部は変更されています。
spring boot 2.0.2.RELEASEリファレンス
バージョン4.2以降、Spring MVCはCORSをサポートしています。 Spring Bootアプリケーションで@CrossOriginアノテーションでコントローラーメソッドCORS構成を使用する場合、特定の構成は必要ありません。次の例に示すように、カスタマイズされたaddCorsMappings(CorsRegistry)メソッドでWebMvcConfigurer Beanを登録することにより、グローバルCORS構成を定義できます。
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
ただし、この投稿のほとんどの回答はWebMvcConfigurerAdapter
を使用しています
WebMvcConfigurerAdapterタイプは非推奨です
Spring 5以降、インターフェイスWebMvcConfigurerを実装する必要があります。
public class MvcConfig implements WebMvcConfigurer {
これは、Java 8がWebMvcConfigurerAdapterクラスの機能をカバーするインターフェースにデフォルトメソッドを導入したためです。
Omarの答えに従って、REST APIプロジェクトにWebConfig.Java
という新しい構成ファイルをこの構成で作成しました。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*");
}
}
これにより、OriginはAPIにアクセスし、Springプロジェクトのすべてのコントローラーに適用できます。
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
のようなメッセージもありました
Corsを適切に構成しましたが、RouterFuncionのwebfluxに欠けていたのはacceptとcontenttypeヘッダーでしたAPPLICATION_JSONこのコードのように:
@Bean
RouterFunction<ServerResponse> routes() {
return route(POST("/create")
.and(accept(APPLICATION_JSON))
.and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest);
}