Spring CORS 'Access-Control-Allow-Origin' başlığı yok


89

Web.xml'yi java config'e taşıdıktan sonra aşağıdaki sorunu alıyorum

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.

Birkaç Bahar referansına dayanarak, aşağıdaki girişim denendi:

@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);
    }

}

Seçilen değerler çalışan bir web.xml filtresinden alınmıştır:

<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 yapılandırma yaklaşımının neden web.xml dosyası gibi çalışmadığına dair bir fikriniz var mı?

Yanıtlar:


115

Dan CorsMapping değiştirin registry.addMapping("/*")için registry.addMapping("/**")de addCorsMappingsyöntemle.

Bu Bahar CORS Dokümantasyonuna göz atın .

Gönderen dokümantasyon -

Tüm uygulama için CORS'u etkinleştirmek şu kadar basittir:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

Herhangi bir özelliği kolayca değiştirebilir, ayrıca bu CORS konfigürasyonunu yalnızca belirli bir yol modeline uygulayabilirsiniz:

@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);
    }
}

Denetleyici yöntemi CORS yapılandırması

@RestController
@RequestMapping("/account")
public class AccountController {
  @CrossOrigin
  @RequestMapping("/{id}")
  public Account retrieve(@PathVariable Long id) {
    // ...
  }
}

Tüm denetleyici için CORS'u etkinleştirmek için -

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

Hem denetleyici düzeyinde hem de yöntem düzeyinde CORS yapılandırmalarını bile kullanabilirsiniz; Daha sonra Spring, birleştirilmiş CORS yapılandırmasını oluşturmak için her iki ek açıklamadaki öznitelikleri birleştirecektir.

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

37
Tüm uygulama için CORS'u etkinleştirmek benim için çalışmıyor.
Dimitri Kopriwa

4
Kullanmak addCorsMappingbenim için işe yaramadı, bahar güvenliği nedeniyle olduğunu söylemek cazip geldi ... ancak buradacorsConfigurationSource önerildiği gibi bir fasulye eklemek sorunumu çözdü.
Geoffrey

1
Ayrıca tüm istemcilere kayıt defteri.addMapping ("/ **"). AllowOrigins ("*"); spring.io/guides/gs/rest-service-cors
spacedev

1
sen gerçekten bir cankurtaransın. Spring 4.2 kullanıyorum ve sayısız başka alternatif denedim ve addCorsMappings geçersiz kılma yöntemini deneyene kadar hepsi işe yaramıyor. Standart CORS başlığının yanı sıra Access-Control-Allow-Headers
Vyrnach

2
2020 ve yaylı önyükleme notu hala çalışmıyor.
theprogrammer

15

Yardımcı ipucu - Spring data rest kullanıyorsanız, farklı bir yaklaşıma ihtiyacınız vardır.

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

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

3
Bu gönderi için teşekkürler. Yayınınızın Spring Data REST'in farklı bir yaklaşım kullandığını söylediğini fark ettiğimde umudumu kaybediyordum. Artık tamamen benim için çalışıyor!
Jonathan Crégut

2
RepositoryRestConfigurerAdapterkullanımdan kaldırıldı. Sadece RepositoryRestConfigurerdoğrudan uygular .
Gustavo Rodrigues

11

Aynı sorunu yaşadık ve Spring'in XML yapılandırmasını kullanarak aşağıdaki gibi çözdük:

Bunu bağlam xml dosyanıza ekleyin

<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>

5

Spring Security ver> = 4.2 kullanıyorsanız Apache'yi dahil etmek yerine Spring Security'nin yerel desteğini kullanabilirsiniz:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

Yukarıdaki örnek , bir denetleyicide CORS'un nasıl yapılandırılacağı, belirli denetleyici yöntemleri vb. Hakkında bilgi bulabileceğiniz bir Spring blog gönderisinden kopyalanmıştır . Ayrıca, XML yapılandırma örnekleri ve Spring Boot entegrasyonu da vardır.


5

Omar'ın cevabını takiben, WebConfig.javabu konfigürasyonla adlandırılan REST API projemde yeni bir sınıf dosyası oluşturdum :

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

Bu, herhangi bir kaynağın API'ye erişmesine izin verir ve bunu Spring projesindeki tüm denetleyicilere uygular.


5

Omkar'ın cevabı oldukça kapsamlı.

Ancak Global yapılandırma bölümünün bir kısmı değişti.

Yaylı körük 2.0.2'ye göre. RELEASE referansı

Sürüm 4.2'den itibaren Spring MVC, CORS'u desteklemektedir. Spring Boot uygulamanızda @CrossOrigin ek açıklamalarıyla denetleyici yöntemi CORS yapılandırmasını kullanmak herhangi bir özel yapılandırma gerektirmez. Global CORS yapılandırması, aşağıdaki örnekte gösterildiği gibi, bir WebMvcConfigurer çekirdeğini özelleştirilmiş addCorsMappings (CorsRegistry) yöntemiyle kaydederek tanımlanabilir:

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}

WebMvcConfigurerAdapterBununla birlikte, bu gönderideki çoğu cevap

WebMvcConfigurerAdapter türü kullanımdan kaldırıldı

İlkbahar 5'ten beri WebMvcConfigurer arayüzünü uygulamanız yeterlidir:

public class MvcConfig implements WebMvcConfigurer {

Bunun nedeni, Java 8'in arabirimlerde WebMvcConfigurerAdapter sınıfının işlevselliğini kapsayan varsayılan yöntemler sunmasıdır.


2

public class 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

Ben de şöyle mesajlar aldım No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.

Korseleri düzgün bir şekilde yapılandırdım, ancak RouterFuncion'daki webflux'ta eksik olan , şu kod parçasındaki gibi kabul edildi ve içerik türü başlıkları APPLICATION_JSON idi :

@Bean
RouterFunction<ServerResponse> routes() {
    return route(POST("/create")
                              .and(accept(APPLICATION_JSON))
                              .and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest);
}


0

Bazı nedenlerden dolayı, biri hala CORS'u geçemiyorsa, isteğinize hangi tarayıcının erişmek istediği başlığı yazın.

Bu fasulyeyi yapılandırma dosyanıza ekleyin.

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

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


        }
    };
}

Bu şekilde, tarayıcıya tüm başlangıç ​​noktalarından çapraz kaynağa izin verdiğimizi söyleyebiliriz. belirli bir yoldan kısıtlamak istiyorsanız, "*" öğesini {' http: // localhost: 3000 ', ""} olarak değiştirin.

Bu davranışı anlamak için yardımcı referans https://www.concretepage.com/spring-4/spring-4-rest-cors-integration-using-crossorigin-annotation-xml-filter-example


0

Çözümü ilkbahar önyüklemesinde @CrossOrigin annotation kullanarak buldum .

@RestController
@CrossOrigin
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.