[SPRING] Spring CORS 'Access-Control-Allow-Origin'헤더가 없습니다.
SPRINGSpring 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.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.우리는 같은 문제가 있었고 우리는 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.유용한 팁 - Spring 데이터 나머지를 사용하는 경우에는 다른 접근 방식이 필요합니다.
유용한 팁 - Spring 데이터 나머지를 사용하는 경우에는 다른 접근 방식이 필요합니다.
@Component public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.getCorsRegistry().addMapping("/**") .allowedOrigins("http://localhost:9000"); } }
-
==============================
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.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.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.나는 또한 '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); }
from https://stackoverflow.com/questions/35091524/spring-cors-no-access-control-allow-origin-header-is-present by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JPA (Hibernate)와 JDBC (JdbcTemplate 또는 MyBatis)가 동일한 트랜잭션을 공유하도록 Spring을 구성하는 방법 (0) | 2018.12.22 |
---|---|
[SPRING] 스프링 보안에서 커스텀 역할 / 권한을 사용하려면 어떻게해야합니까? (0) | 2018.12.22 |
[SPRING] log4j : WARN web.xml에서 logger에 대한 appender를 찾을 수 없습니다. (0) | 2018.12.22 |
[SPRING] @Transactional 어노테이션없이 다른 메소드를 호출하는 트랜잭션 메소드? (0) | 2018.12.22 |
[SPRING] Spring에서 현재 ApplicationContext 가져 오기 (0) | 2018.12.22 |