Spring CORS ไม่มีส่วนหัว 'Access-Control-Allow-Origin' อยู่


89

ฉันได้รับปัญหาต่อไปนี้หลังจากพอร์ต web.xml เป็น java config

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

คำตอบ:


115

เปลี่ยน CorsMapping จากregistry.addMapping("/*")เป็นregistry.addMapping("/**")ในaddCorsMappingsวิธี

ดูเอกสาร Spring CORS นี้

จากเอกสารประกอบ -

การเปิดใช้งาน 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) {
        // ...
    }
}

37
การเปิดใช้ CORS สำหรับแอปพลิเคชันทั้งหมดไม่ได้ผลสำหรับฉัน
Dimitri Kopriwa

4
การใช้addCorsMappingไม่ได้ผลสำหรับฉันอยากจะบอกว่าเป็นเพราะความปลอดภัยในฤดูใบไม้ผลิ ... อย่างไรก็ตามการเพิ่มcorsConfigurationSourceถั่วตามที่แนะนำในที่นี้ช่วยแก้ปัญหาของฉันได้
Geoffrey

1
นอกจากนี้ไม่ควรลืมที่จะอนุญาตให้ลูกค้าทั้งหมด Registry.addMapping ("/ **"). allowOrigins ("*"); spring.io/guides/gs/rest-service-cors
spacedev

1
คุณคือผู้ช่วยชีวิตอย่างแท้จริง ฉันใช้ Spring 4.2 และลองใช้ทางเลือกอื่น ๆ อีกนับไม่ถ้วนและทั้งหมดก็ใช้ไม่ได้จนกว่าฉันจะลองใช้วิธีแทนที่ addCorsMappings อาจช่วยหรือไม่ก็ได้เพิ่มส่วนหัว CORS มาตรฐานรวมทั้ง Access-Control-Allow-Headers
Vyrnach

2
คำอธิบายประกอบในปี 2020 และสปริงบูตยังใช้ไม่ได้
theprogrammer

15

เคล็ดลับที่เป็นประโยชน์ - หากคุณใช้ Spring data rest คุณต้องมีแนวทางอื่น

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

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

3
ขอบคุณสำหรับโพสต์นี้ ฉันรู้สึกสูญเสียความหวังเมื่อสังเกตเห็นโพสต์ของคุณบอกว่า Spring Data REST ใช้วิธีการอื่น ทำงานให้ฉันโดยสิ้นเชิง!
Jonathan Crégut

2
RepositoryRestConfigurerAdapterเลิกใช้แล้ว เพียงแค่ดำเนินการRepositoryRestConfigurerโดยตรง
Gustavo Rodrigues

11

เรามีปัญหาเดียวกันและเราแก้ไขโดยใช้การกำหนดค่า XML ของ Spring ดังต่อไปนี้:

เพิ่มสิ่งนี้ในไฟล์ 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>

5

หากคุณใช้ Spring Security ver> = 4.2 คุณสามารถใช้การสนับสนุนดั้งเดิมของ Spring Security แทนการรวม Apache's:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

ตัวอย่างข้างต้นคัดลอกมาจากบล็อกโพสต์ Spring ซึ่งคุณสามารถค้นหาข้อมูลเกี่ยวกับวิธีกำหนดค่า CORS บนคอนโทรลเลอร์วิธีการควบคุมเฉพาะ ฯลฯ นอกจากนี้ยังมีตัวอย่างการกำหนดค่า XML รวมถึงการรวม Spring Boot


5

ตามคำตอบของ Omar ฉันได้สร้างไฟล์คลาสใหม่ในโครงการ REST API ของฉันที่เรียกWebConfig.javaด้วยการกำหนดค่านี้:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

สิ่งนี้ช่วยให้ต้นกำเนิดใด ๆ เข้าถึง API และนำไปใช้กับตัวควบคุมทั้งหมดในโครงการ Spring


5

คำตอบของ Omkar ค่อนข้างครอบคลุม

แต่บางส่วนของส่วนกำหนดค่าส่วนกลางมีการเปลี่ยนแปลง

อ้างอิงจากสปริงบูต 2.0.2 การอ้างอิงรีลีส

สำหรับเวอร์ชัน 4.2 Spring MVC รองรับ CORS การใช้วิธีการควบคุมการกำหนดค่า CORS ด้วยคำอธิบายประกอบ @CrossOrigin ในแอปพลิเคชัน Spring Boot ของคุณไม่จำเป็นต้องมีการกำหนดค่าเฉพาะใด ๆ การกำหนดคอนฟิก Global CORS สามารถกำหนดได้โดยการลงทะเบียน WebMvcConfigurer bean ด้วยเมธอด addCorsMappings (CorsRegistry) ที่กำหนดเองดังที่แสดงในตัวอย่างต่อไปนี้:

@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


2

คลาสสาธารณะ 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 อย่างถูกต้อง แต่สิ่งที่ขาดหายไปใน webflux ใน RouterFuncion คือการยอมรับและส่วนหัวประเภทเนื้อหาAPPLICATION_JSONเช่นในส่วนของโค้ดนี้:

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

0

ตามที่ @Geoffrey ชี้ให้เห็นด้วยความปลอดภัยในฤดูใบไม้ผลิคุณต้องมีแนวทางอื่นตามที่อธิบายไว้ที่นี่: Spring Boot Security CORS


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

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