स्प्रिंग कॉर्स नो 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन' हेडर मौजूद है


85

मैं जाव विन्यास में web.xml पोर्ट करने के बाद निम्न समस्या हो रही है

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

कुछ वसंत संदर्भों के आधार पर, निम्नलिखित प्रयास किए गए हैं:

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

किसी भी विचार क्यों वसंत जावा विन्यास दृष्टिकोण web.xml फ़ाइल की तरह काम नहीं कर रहा है?

जवाबों:


112

से CorsMapping बदलें registry.addMapping("/*")करने registry.addMapping("/**")में addCorsMappingsविधि।

इस स्प्रिंग कॉर्स डॉक्यूमेंटेशन को देखें

से प्रलेखन -

संपूर्ण एप्लिकेशन के लिए 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) {
    // ...
  }
}

पूरे नियंत्रक के लिए कॉर्स को सक्षम करने के लिए -

@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 कॉन्फ़िगरेशन दोनों का उपयोग कर सकते हैं; तब विलय विलय को बनाने के लिए स्प्रिंग दोनों एनोटेशन से विशेषताओं को संयोजित करेगा।

@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 सक्षम करना मेरे लिए काम नहीं करता है।
दिमित्री कोपरिवा

4
उपयोग करना addCorsMappingमेरे लिए काम नहीं आया, यह कहना कि यह वसंत सुरक्षा की वजह से लुभाया गया है ... हालांकि, एक corsConfigurationSourceबीन को जोड़ने के रूप में यहां सुझाए गए मेरे मुद्दे को हल किया गया।
ज्योफ्री

1
इसके अलावा सभी ग्राहकों को रजिस्ट्री की अनुमति देने के लिए नहीं भूलना चाहिए। आधार मैपिंग ("/ **")। allowOrigins ("*"); spring.io/guides/gs/rest-service-cors
spacedev

1
तुम वास्तव में एक जीवन रक्षक हो। मैं स्प्रिंग 4.2 का उपयोग कर रहा हूं और अनगिनत अन्य विकल्पों की कोशिश कर रहा हूं और जब तक मैं ऐडऑर्क्स मैपिंग ओवरराइड करने की कोशिश नहीं करता, तब तक वे सभी काम नहीं करते। मई या नहीं मदद की जा सकती है मानक CORS हेडर के साथ-साथ Access-Control-Allow-Headers
Vyrnach

2
इसका 2020, और वसंत बूट एनोटेशन अभी भी काम नहीं करता है।
theprogrammer

14

सहायक टिप - यदि आप स्प्रिंग डेटा आराम का उपयोग कर रहे हैं तो आपको एक अलग दृष्टिकोण की आवश्यकता है।

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

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

3
इस पोस्ट के लिए धन्यवाद। मैं थोथा उम्मीद खो रहा था जब मैंने आपकी पोस्ट को यह कहते हुए देखा कि स्प्रिंग डेटा रीस्ट एक अलग दृष्टिकोण का उपयोग करता है। पूरी तरह से मेरे लिए अब काम करता है!
जोनाथन क्रेगट

2
RepositoryRestConfigurerAdapterपदावनत किया गया है। बस RepositoryRestConfigurerसीधे लागू करता है।
गुस्तावो रोड्रिग्स

9

हमारे पास एक ही मुद्दा था और हमने इसे नीचे दिए गए स्प्रिंग के 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

यदि आप स्प्रिंग सिक्योरिटी वर्जन = = 4.2 का उपयोग कर रहे हैं, तो आप अपाचे को शामिल करने के बजाय स्प्रिंग सुरक्षा के मूल समर्थन का उपयोग कर सकते हैं:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

ऊपर दिए गए उदाहरण को एक स्प्रिंग ब्लॉग पोस्ट से कॉपी किया गया था जिसमें आप एक नियंत्रक, विशिष्ट नियंत्रक विधियों आदि पर कॉर्स को कॉन्फ़िगर करने के तरीके के बारे में भी जानकारी पा सकते हैं, इसके अलावा, XML कॉन्फ़िगरेशन उदाहरणों के साथ-साथ स्प्रिंग बूट एकीकरण भी है।


4

उमर के जवाब के बाद, मैंने अपने REST API प्रोजेक्ट में एक नई क्लास फाइल बनाई, जिसे WebConfig.javaइस कॉन्फ़िगरेशन के साथ बुलाया गया:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

यह किसी भी मूल एपीआई को एक्सेस करने की अनुमति देता है और इसे स्प्रिंग प्रोजेक्ट के सभी नियंत्रकों पर लागू करता है।


4

ओंकार का उत्तर काफी व्यापक है।

लेकिन Global config part का कुछ हिस्सा बदल गया है।

वसंत बूट 2.0.2 के अनुसार। संदर्भ देखें

संस्करण 4.2 के अनुसार, स्प्रिंग एमवीसी कोर का समर्थन करता है। आपके स्प्रिंग बूट एप्लिकेशन में @CrossOrigin एनोटेशन के साथ कंट्रोलर विधि CORS कॉन्फ़िगरेशन का उपयोग करने के लिए किसी विशिष्ट कॉन्फ़िगरेशन की आवश्यकता नहीं होती है। Global CORS कॉन्फ़िगरेशन को एक अनुकूलित AddCorsMappings (CorsRegistry) विधि के साथ WebMvcConfigurer सेम रजिस्टर करके परिभाषित किया जा सकता है, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:

@Configuration
public class MyConfiguration {

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

WebMvcConfigurerAdapterहालाँकि इस पोस्ट में अधिकांश उत्तर का उपयोग किया गया है

प्रकार WebMvcConfigurerAdapter पदावनत है

5 वसंत के बाद से आपको बस इंटरफ़ेस WebMvcConfigurer लागू करने की आवश्यकता है:

public class MvcConfig implements WebMvcConfigurer {

ऐसा इसलिए है क्योंकि Java 8 ने उन इंटरफेस पर डिफ़ॉल्ट तरीके पेश किए हैं जो WebMvcConfigurerAdapter क्लास की कार्यक्षमता को कवर करते हैं


1

पब्लिक क्लास ट्रैकिंगसिस्टमऐप्लिकेशन {

    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 में वेबफ्लक्स में जो चीज गायब थी, वह स्वीकार कर ली गई थी और सामग्री हेडर APPLICATION_JSON कोड के इस टुकड़े की तरह:

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


0

किसी कारण से, यदि फिर भी कोई व्यक्ति CORS को बायपास करने में सक्षम नहीं है, तो हेडर लिखें जो ब्राउज़र आपके अनुरोध तक पहुंचना चाहता है।

इस सेम को अपनी कॉन्फ़िगरेशन फ़ाइल के अंदर जोड़ें।

@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 एनोटेशन का उपयोग करके स्प्रिंग बूट में समाधान पाया है ।

@RestController
@CrossOrigin
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.