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 파일처럼 작동하지 않는 이유는 무엇입니까?
답변
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);
}
}
@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) {
// ...
}
}
답변
유용한 팁-Spring 데이터 휴식을 사용하는 경우 다른 접근 방식이 필요합니다.
@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.getCorsRegistry().addMapping("/**")
.allowedOrigins("http://localhost:9000");
}
}
답변
우리는 같은 문제가 있었고 아래와 같이 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>
답변
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 통합도 있습니다.
답변
Omar의 답변에 따라이 WebConfig.java
구성으로 호출 되는 REST API 프로젝트에 새 클래스 파일을 만들었습니다 .
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*");
}
}
이를 통해 모든 오리진이 API에 액세스하고이를 Spring 프로젝트의 모든 컨트롤러에 적용 할 수 있습니다.
답변
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 클래스의 기능을 다루는 인터페이스에 기본 메소드를 도입했기 때문입니다.
답변
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");
}
};
}
}