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
'programing' 카테고리의 다른 글
SQL에서 SELECT INTO를 사용하여 새 테이블 생성 (0) | 2023.03.28 |
---|---|
경로를 사용하는 재료 UI 메뉴 (0) | 2023.03.28 |
setState가 즉시 업데이트되지 않음 (0) | 2023.03.28 |
Angular를 테스트하려면 어떻게 해야 합니까?재스민과의 JS 서비스? (0) | 2023.03.28 |
컬렉션 잘라내기 (0) | 2023.03.28 |