복붙노트

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

SPRING

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

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>

스프링 자바 설정 접근법이 web.xml 파일처럼 작동하지 않는 이유는 무엇입니까?

해결법

  1. ==============================

    1.addCorsMappings 메소드의 registry.addMapping ( "/ *")에서 registry.addMapping ( "/ **")으로 CorsMapping을 변경하십시오.

    addCorsMappings 메소드의 registry.addMapping ( "/ *")에서 registry.addMapping ( "/ **")으로 CorsMapping을 변경하십시오.

    이 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) {
            // ...
        }
    }
    
  2. ==============================

    2.우리는 같은 문제가 있었고 우리는 Spring의 XML 설정을 아래와 같이 사용하여 해결했습니다 :

    우리는 같은 문제가 있었고 우리는 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>
    
  3. ==============================

    3.유용한 팁 - Spring 데이터 나머지를 사용하는 경우에는 다른 접근 방식이 필요합니다.

    유용한 팁 - Spring 데이터 나머지를 사용하는 경우에는 다른 접근 방식이 필요합니다.

    @Component
    public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {
    
     @Override
     public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.getCorsRegistry().addMapping("/**")
                .allowedOrigins("http://localhost:9000");
      }
    }
    
  4. ==============================

    4.Spring Security ver 4.2 이상을 사용하고 있다면, Apache를 포함하지 않고 Spring Security의 기본 지원을 사용할 수 있습니다 :

    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 구성 예제도 있습니다.

  5. ==============================

    5.Omar의 대답에 이어,이 구성으로 WebConfig.java라는 REST API 프로젝트에 새 클래스 파일을 만들었습니다.

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

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
      }
    } 
    

    이를 통해 모든 출처가 API에 액세스하여이를 Spring 프로젝트의 모든 컨트롤러에 적용 할 수 있습니다.

  6. ==============================

    6.Omkar의 답변은 상당히 포괄적입니다.

    Omkar의 답변은 상당히 포괄적입니다.

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

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

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

    그러나이 게시물에서 WebMvcConfigurerAdapter를 사용하는 대부분의 대답은

    WebMvcConfigurerAdapter 유형은 사용되지 않습니다.

  7. ==============================

    7.나는 또한 'Access-Control-Allow-Origin'헤더가 요청 된 리소스에 존재하지 않는다는 메시지를 보냈다. 따라서 'http : // localhost : 63342'는 액세스가 허용되지 않습니다.

    나는 또한 'Access-Control-Allow-Origin'헤더가 요청 된 리소스에 존재하지 않는다는 메시지를 보냈다. 따라서 'http : // localhost : 63342'는 액세스가 허용되지 않습니다.

    난 제대로 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);
    }
    
  8. from https://stackoverflow.com/questions/35091524/spring-cors-no-access-control-allow-origin-header-is-present by cc-by-sa and MIT license