태그 보관물: spring

spring

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

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

컨트롤러 방법 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) {
        // ...
    }
}


답변

유용한 팁-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");
            }
        };
    }

}