SpringCORSいいえ 'Access-Control-Allow-Origin'ヘッダーが存在します


84

web.xmlをjavaconfigに移植した後、次の問題が発生します

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 configアプローチがweb.xmlファイルのように機能しない理由はありますか?

回答:


112

CorsMappingをregistry.addMapping("/*")からregistry.addMapping("/**")inaddCorsMappingsメソッドに変更します。

このSpringCORSドキュメントを確認してください。

ドキュメントから-

アプリケーション全体で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);
    }
}

コントローラ方式のCORS設定

@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) {
        // ...
    }
}

36
アプリケーション全体でCORSを有効にしてもうまくいきません。
Dimitri Kopriwa 2016年

4
使用addCorsMappingは私にはうまくいきませんでした、それは春のセキュリティのためだと言いたくなりました...しかし、ここでcorsConfigurationSource提案れているようにBeanを追加すること私の問題は解決しました。
ジェフリー2017

1
また、すべてのクライアントにregistry.addMapping( "/ **")。allowedOrigins( "*");を許可することを忘れないでください。 spring.io/guides/gs/rest-service-cors
spacedev

1
あなたは本当に命の恩人です。私はSpring4.2を使用していて、他の無数の代替手段を試しましたが、addCorsMappingsオーバーライド方法を試すまで、それらはすべて機能しません。標準のCORSヘッダーとAccess-Control-Allow-Headers
Vyrnach19年

2
その2020、および春のブートアノテーションはまだ機能しません。
プログラマー

14

役立つヒント-Springdata restを使用している場合は、別のアプローチが必要です。

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

 @Override
 public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.getCorsRegistry().addMapping("/**")
            .allowedOrigins("http://localhost:9000");
  }
}

3
この投稿をありがとう。Spring Data RESTが別のアプローチを使用しているというあなたの投稿に気づいたとき、私はちょっと希望を失っていました。今私のために完全に働きます!
ジョナサンCrégut

2
RepositoryRestConfigurerAdapterは非推奨です。RepositoryRestConfigurer直接実装するだけです。
グスタボロドリゲス

9

同じ問題が発生し、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>

4

Spring Security ver> = 4.2を使用している場合は、Apacheを含める代わりに、SpringSecurityのネイティブサポートを使用できます。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

上記の例はSpringからコピーされたものです ブログ投稿で、コントローラーでCORSを構成する方法、特定のコントローラーメソッドなどに関する情報もあります。さらに、XML構成の例とSpringBootの統合もあります。


4

Omarの回答に続いて、RESTAPIプロジェクトWebConfig.javaに次の構成で呼び出される新しいクラスファイルを作成しました。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**").allowedOrigins("*");
  }
} 

これにより、すべてのオリジンがAPIにアクセスし、Springプロジェクトのすべてのコントローラーに適用できるようになります。


4

オムカーの答えは非常に包括的です。

ただし、グローバル構成部分の一部が変更されています。

スプリングブーツ2.0.2.RELEASEリファレンスによると

バージョン4.2以降、SpringMVCはCORSをサポートします。Spring Bootアプリケーションで@CrossOriginアノテーションを使用してコントローラーメソッドのCORS構成を使用する場合、特定の構成は必要ありません。次の例に示すように、WebMvcConfigurer BeanをカスタマイズされたaddCorsMappings(CorsRegistry)メソッドに登録することで、グローバル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 {

これは、Java8がWebMvcConfigurerAdapterクラスの機能をカバーするインターフェースにデフォルトのメソッドを導入したためです。


1

パブリッククラスTrackingSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(TrackingSystemApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:4200").allowedMethods("PUT", "DELETE",
                        "GET", "POST");
            }
        };
    }

}

0

私も次のようなメッセージがありました 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);
}


0

何らかの理由で、それでも誰かがCORSをバイパスできない場合は、ブラウザがリクエストにアクセスするヘッダーを記述します。

このBeanを構成ファイル内に追加します。

@Bean
public WebSecurityConfigurerAdapter webSecurity() {
    return new WebSecurityConfigurerAdapter() {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.headers().addHeaderWriter(
                    new StaticHeadersWriter("Access-Control-Allow-Origin", "*"));


        }
    };
}

このようにして、すべてのオリジンからのクロスオリジンを許可していることをブラウザに伝えることができます。特定のパスから制限する場合は、「*」を{' http:// localhost:3000 '、 ""}に変更します。

この動作を理解するための役立つリファレンスhttps://www.concretepage.com/spring-4/spring-4-rest-cors-integration-using-crossorigin-annotation-xml-filter-example


0

@CrossOriginアノテーションを使用して、SpringBootで解決策を見つけました。

@RestController
@CrossOrigin
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.