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");
            }
        };
    }
}