programing

application.properties에 의한 CORS 활성화 스프링 부트

codeshow 2023. 3. 28. 22:23
반응형

application.properties에 의한 CORS 활성화 스프링 부트

당신의 엔티티 클래스에서 자동으로 기동하는 Spring Boot API RESTful을 사용하고 있습니다.프런트엔드 웹 앱에서 이 apiRest를 사용하고 있는데 다음과 같은 오류가 나타납니다.

요청된 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.

여기서 지정한 application.properties를 사용하여 CORS 구성을 설정합니다.

기본 설정은 다음과 같습니다.

endpoints.cors.allow-credentials=true
endpoints.cors.allowed-origins=*
endpoints.cors.allowed-methods=*
endpoints.cors.allowed-headers=*

나는 그 변수들에 대해 다른 조합을 시도했지만 여전히 작동하지 않는다.좋은 생각 있어요?

이는 Spring 공식 문서에서는 명확하지 않으며 Spring Boot 공식 문서에 오도되기 쉽습니다.

사실은 application.properties 파일을 사용하여 글로벌 CORS 설정을 설정할 수 없습니다.Spring Framework Documentation Cors 장에 설명된 대로 JavaConfig를 사용해야 합니다.

를 사용합니다.@EnableWebMvc@Configuration WebMvcConfigurer 이 위에 덧씌우게 됩니다.addCorsMappings을 사용하다

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

나는 스스로 답을 얻었다.

이것을 응용 프로그램에 추가하세요.자바

  @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }

endpoints.cors.*가 앞에 붙는 스프링 부트 속성은 액추에이터에 의해 사용되므로 MVC 엔드포인트에서는 작동하지 않습니다.

실제 cors 관련 URL을 application.properties로 이동할 수 있습니다.Spring Boot 5에서 사용할 수 있습니다.

App.java(메인 클래스):

@SpringBootApplication
public class App extends SpringBootServletInitializer {

    @Autowired
    private Environment env;

    public static void main(String[] args) {
        SpringApplication.run(ReportsApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                String urls = env.getProperty("cors.urls");
                CorsRegistration reg = registry.addMapping("/api/**");
                for(String url: urls.split(",")) {
                    reg.allowedOrigins(url);
                }
            }
        };
    }    
}

application.properties:

cors.urls=http://localhost:3000

application.properties에 저장할 경우 문자열을 삽입할 수 있습니다.

개발

# application-dev.properties
appName.allowedApi=http://localhost:4200

프로덕트

# application-prod.properties
appName.allowedApi=https://appname.com

WebConfig.java에서

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Value("${appName.allowedApi}")
    private String myAllowedApi;
  
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins(myAllowedApi);
    }
}

Spring-Boot 2.1.2에서 확인:

먼저 어떤 서블릿필터가 이미 설치되어 있는지 알아야 합니다.서블릿 필터는 응답 헤더 "Access-Control-Allow-Origin"을 추가합니다.봄 일지를 찾아 봄에서 유래한 CorsFilter를 추가하기로 했습니다.

@Bean
public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("http://127.0.0.1:4200");
    config.addAllowedOrigin("http://localhost:4200");
    config.addAllowedHeader("*");
    config.setAllowedMethods(Arrays.asList("OPTIONS", "GET"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/actuator/**", config);

    return new CorsFilter(source);
}

CorsFilter를 주입하고 있기 때문에 그 안에서 무슨 일이 일어나고 있는지 쉽게 알 수 있습니다.이 경우 - "/actuator/**" 이외의 OTHER 엔드포인트를 누릅니다.사용할 수 있는 설정은 없습니다.

여기에 이미지 설명 입력

위의 (null)이 있다고 해서 "Access-Control-Allow-Origin"이 존재하지 않는 것은 아닙니다.삽입된 필터 이외의 필터로 추가할 수 있습니다(예를 들어 컨트롤러가 @CrossOrigin으로 주석을 달고 있는 경우 크로스 오리진 헤더는 CorsFilter 이외의 다른 MVC 필터에 추가됩니다).

다음 예에서는 /actuator를 누릅니다.

여기에 이미지 설명 입력

http-response에 헤더를 추가하는 독자적인 커스텀필터를 작성할 수도 있습니다.표준적인 방법을 사용하는 것이 좋다고 생각합니다만, 디버깅의 경우에 따라서는, 파일러에 행을 추가하는 것으로, 원하는 것을 추가할 수 있는 것을 알 수 있습니다.

response.addHeader("Access-Control-Allow-Origin", "*");

상기 조건 체크는 이전에 제공된 것이 아닙니다.

이게 도움이 됐으면 좋겠다.건배.

언급할 가치가 있는 것은 새로운 버전의 봄과 함께 당신은 다음을 사용하여 허용된 기원에 대한 패턴을 추가할 수 있다는 것입니다.allowedOriginsPattrens빌더 방식이 경우, 발신지를 엄밀하게 지정할 필요는 없습니다.

public class YourConfig implements WebMvConfigurer {
  (...)
    public void addCorsMapping(Corsregistry registry) {
       registry.addMapping(""/your/endpoints/root/**)
         .allowCredentials(true)
         .allowedOriginsPatterns("*.your.domain1.com", "*.your.domain2.com)
        .allowHeaders("*")
        .allowMethods("*");
   }
}

application.property 파일에 오리진 및 헤더를 추가합니다.쉼표 뒤에 공백이 없는지 확인합니다.

allowed.origins = http://localhost:3000,http://192.168.00.00:3000,http://servername:3000
allowed.headers = Content-Type,Authorization,loggedInUserId,Cache-Control,Pragma,Expires

WebMvcConfigr 구현 파일

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

@Value("${allowed.origins}")
private String allowedOrigins;
@Value("${allowed.headers}")
private String allowedHeaders;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
   
    CorsRegistration reg = registry.addMapping("/**").allowedMethods("*");
    reg.allowedOrigins(allowedOrigins.split(","));
    reg.allowedHeaders(allowedHeaders.split(","));
    }
 
}

spring boot2 에서는 심플하지만 관리 acutator에서 크로스 도메인 URL을 지정하기만 하면 됩니다.

management.endpoints.web.cors.allowed-origins=http://examaple.com ,http://examaple1.com 
management.endpoints.web.cors.allowed-methods=GET, POST

특정 컨트롤러에 대해 이 작업을 수행하기 위한 하나의 솔루션:@CrossOrigin주석:

컨트롤러 클래스의 경우:

@CrossOrigin(origins = "${client.url}")
@Controller
@RequestMapping(path = "/foo")
public class FooController {
  ...
}

application.properties:

# Client URL
client.url=http://localhost:4200

@RequestMapping 위에 @CrossOrigin 주석을 추가합니다.

@CrossOrigin
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
    // ...
}

라이브러리를 사용하여 Mvc 및 플럭스 속성 파일별로 CORS를 구성할 수 있습니다.
나는 이것을 위해 도서관을 특별하게 만들었고 이 도서관의 구현을 위해 오랫동안 프로덕션에서 일했다.
maven central의 Spring-web-MVC용
스프링-웹-플럭스 in maven central용


종속성을 더하다

<dependency>
  <groupId>io.github.iruzhnikov</groupId>
  <artifactId>spring-webmvc-cors-properties-autoconfigure</artifactId>
  <version>VERSION</version>
</dependency>

에 추가하다.application.yml(물론 디폴트 사용 가능)application.properties)

spring:
  web:
    cors:
      enabled: true
      mappings: #spring.web.cors.mappings.<any_name>.<property>: <value>
        anyName: #just any name, just for grouping properties under the same path pattern (not used in internal logic)
          paths: #ant style path pattern, ATTENTION! not ordered, /** pattern override all other pattern
            - /path/to/api
            - /path/to/api/**
          #allowed-origins: "*"
          allowed-methods: GET #Enable override all defaults! If disabled: a lot more from all the controller methods included from the path pattern matches
          #allowed-headers: "*"
          #exposed-headers: ('*' - not-supported)
          #allow-credentials: true
          allowed-origin-patterns: .*
          #max-age: PT30M

언급URL : https://stackoverflow.com/questions/42874351/spring-boot-enabling-cors-by-application-properties

반응형