Spring CORS 'Access-Control-Allow-Origin'헤더가 없습니다.


85

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 파일처럼 작동하지 않는 이유는 무엇입니까?

답변:


112

CorsMapping을 registry.addMapping("/*")에서 registry.addMapping("/**")in 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) {
        // ...
    }
}

36
전체 응용 프로그램에 대해 CORS를 활성화하는 것은 저에게 효과가 없습니다.
Dimitri Kopriwa 2016 년

4
사용 addCorsMapping은 나를 위해 작동하지 않았고 봄 보안 때문이라고 말하고 corsConfigurationSource싶었지만 여기에 제안 된대로 콩을 추가하면 문제가 해결되었습니다.
Geoffrey

1
또한 모든 클라이언트를 허용하는 것을 잊지 말아야합니다. registry.addMapping ( "/ **"). allowedOrigins ( "*"); spring.io/guides/gs/rest-service-cors
spacedev

1
당신은 진정으로 생명의 은인입니다. 나는 Spring 4.2를 사용하고 있으며 수많은 다른 대안을 시도했으며 addCorsMappings 재정의 방법을 시도하기 전까지는 모두 작동하지 않습니다. 또는 표준 CORS가 액세스 제어 - 허용 - 헤더뿐만 아니라 헤더에 추가됩니다 도움이되지 않을 수도 있습니다
Vyrnach

2
2020 및 스프링 부트 주석은 여전히 ​​작동하지 않습니다.
theprogrammer

14

유용한 팁-Spring 데이터 휴식을 사용하는 경우 다른 접근 방식이 필요합니다.

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

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

3
이 게시물에 감사드립니다. 나는 SpringData REST가 다른 접근 방식을 사용한다는 귀하의 게시물을 발견했을 때 희망을 잃었습니다. 지금 완전히 나를 위해 작동합니다!
Jonathan Crégut

2
RepositoryRestConfigurerAdapter더 이상 사용되지 않습니다. RepositoryRestConfigurer직접 구현 합니다.
Gustavo Rodrigues

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를 포함하는 대신 Spring Security의 기본 지원을 사용할 수 있습니다.

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

위의 예 는 컨트롤러에서 CORS를 구성하는 방법, 특정 컨트롤러 메서드 등에 대한 정보를 찾을 수 있는 Spring 블로그 게시물 에서 복사되었습니다 . 또한 XML 구성 예제와 Spring Boot 통합도 있습니다.


4

Omar의 답변에 따라이 WebConfig.java구성으로 호출 되는 REST API 프로젝트에 새 클래스 파일을 만들었습니다 .

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

이를 통해 모든 오리진이 API에 액세스하고이를 Spring 프로젝트의 모든 컨트롤러에 적용 할 수 있습니다.


4

Omkar의 대답은 매우 포괄적입니다.

그러나 글로벌 구성 부분의 일부가 변경되었습니다.

스프링 부트 2.0.2.RELEASE 참조 에 따르면

4.2 버전부터 Spring MVC는 CORS를 지원합니다. Spring Boot 애플리케이션에서 @CrossOrigin 어노테이션과 함께 컨트롤러 메소드 CORS 구성을 사용하면 특정 구성이 필요하지 않습니다. 전역 CORS 구성은 다음 예제와 같이 사용자 정의 된 addCorsMappings (CorsRegistry) 메소드로 WebMvcConfigurer Bean을 등록하여 정의 할 수 있습니다.

@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 클래스의 기능을 다루는 인터페이스에 기본 메소드를 도입했기 때문입니다.


1

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

나는 또한 같은 메시지가 있었다 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 주석 을 사용하여 봄 부팅에서 해결책을 찾았습니다 .

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