스프링 데이터 받침대 및 Cors
저는 Rest 인터페이스와 다트가 전면에 있는 Spring Boot 애플리케이션을 개발하고 있습니다.
XMLHttpRequest는 완전히 올바른 OPTIONS 요청을 실행합니다.이 후 최종 GET("/제품") 요청이 실행되고 실패합니다.
요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.따라서 오리진 'http://localhost:63343'에 액세스할 수 없습니다.
디버깅한 결과 다음과 같은 것을 발견했습니다.AbstractHandlerMapping.corsConfiguration은 RepositoryRestHandlerMapping을 제외한 모든 하위 클래스에 대해 채워집니다.RepositoryRestHandler Mapping에는 생성 시 corsConfiguration이 없으므로 cors 경로/리소스로 인식되지 않습니다.
=> CORS 헤더가 부착되지 않음
그게 문제일까요?어떻게 설정해야 하나요?
구성 클래스:
@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(false).allowedOrigins("*").allowedMethods("PUT", "POST", "GET", "OPTIONS", "DELETE").exposedHeaders("Authorization", "Content-Type");
}
...
}
저는 심지어 주석당 코르스를 설정하려고 했습니다.
@CrossOrigin( methods = RequestMethod.GET, allowCredentials = "false")
public interface ProductRepository extends CrudRepository<Product, String> {
}
원시 요청 헤더:
GET /products HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36
Content-Type: application/json
Accept: */*
Referer: http://localhost:63343/inventory-web/web/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
원시 응답 헤더:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 30 Jul 2015 15:58:03 GMT
사용된 버전: Spring Boot 1.3.0.M2 스프링 4.2.0.RC2
뭐가 그리울까요?
실제로 Spring Data REST 2.6(Ingalls) 이전 버전만HandlerMapping
Spring MVC에서 생성한 인스턴스WebMvcConfigurationSupport
및 컨트롤러에 주석을 달았습니다.@CrossOrigin
CORS가 알고 있었습니다.
하지만 이제 DATAREST-573이 수정되었으니,RepositoryRestConfiguration
이제 a를 공개합니다.getCorsRegistry()
글로벌 설정 및@CrossOrigin
저장소의 주석도 인식되므로 이 방법을 사용하는 것이 좋습니다.구체적인 예는 https://stackoverflow.com/a/42403956/1092077 답변을 참조하십시오.
Spring Data REST 2.5(Hopper) 또는 이전 버전을 고수해야 하는 사람들에게는 필터 기반 접근 방식을 사용하는 것이 가장 좋은 해결책이라고 생각합니다.분명히 Tomcat, Jetty 또는 이것을 사용할 수 있지만 Spring Framework 4.2는 또한 다음과 같은 CORS 처리 로직을 사용하는 것을 제공합니다.@CrossOrigin
그리고.addCorsMappings(CorsRegistry registry)
접근법인스턴스를 에 전달함으로써CorsFilter
생성자 매개 변수, 스프링 네이티브 CORS 글로벌 지원만큼 강력한 것을 쉽게 얻을 수 있습니다.
Spring Boot을 사용하는 경우(지원하는 Spring Boot)Filter
콩), 다음과 같은 것일 수 있습니다.
@Configuration
public class RestConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
Ingalls 트레인이 실현된 이후, Spring Data에서 CORS의 지원이 시작되었습니다.두 가지 방법으로 처리할 수 있습니다.
그
@CrossOrigin
주및 지한주를origins
,methods
,그리고.allowedHeaders
1파운드를@RepositoryRestResource
interface 이름@CrossOrigin(...) @RepositoryRestResource public interface PageRepository extends CrudRepository<Page, Long> { ... }
를 한 글로벌 입니다.
RepositoryRestConfiguration
富士山의@Configuration
class.를 합니다. 기준으로 리포지토리 표시@CrossOrigin
그럴 필요는 없습니다.@Configuration public class GlobalRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.getCorsRegistry() .addMapping(CORS_BASE_PATTERN) .allowedOrigins(ALLOWED_ORIGINS) .allowedHeaders(ALLOWED_HEADERS) .allowedMethods(ALLOWED_METHODS); } }
어떤 이유에서인지 Spring Boot 1.5.2에서 1.5.6으로 업그레이드한 후 위의 승인된 답변에서 제시된 접근 방식은 저에게 효과가 없었습니다.
@BigDong의 코멘트에서도 지적되었듯이, 제가 받은 예외는 다음과 같습니다.
빈 인스턴스화예외:[javax.servlet]을(를) 인스턴스화하지 못했습니다.필터]:공장 메서드 'springSecurityFilterChain'에서 예외를 발생시켰습니다. 중첩 예외는 org.springframework입니다.콩 공장BeanNotOfRequiredTypeException: 'corsFilter'라는 이름의 Bean은 'org.springframework.web.filter' 유형이어야 합니다.CorsFilter'이지만 실제로는 'org.springframework.boot.web.servlet' 유형입니다.필터 등록 빈
Spring Data Rest 또는 Spring MVC를 사용하여 구현되고 모든 엔드포인트가 Spring Security에 의해 보호되는지 여부에 관계없이 REST API의 모든 엔드포인트에 대해 "글로벌" CORS 구성을 구현하기 위해 다음과 같이 생각했습니다.
를 할 수 CorsFilter
시점에 했습니다. 하여 SDR과 MVC를 설정했습니다. 그러나 동일한 구성을 사용합니다.CorsRegistry
도우미를 합니다.
public static void applyFullCorsAllowedPolicy(CorsRegistry registry) {
registry.addMapping("/**") //
.allowedOrigins("*") //
.allowedMethods("OPTIONS", "HEAD", "GET", "PUT", "POST", "DELETE", "PATCH") //
.allowedHeaders("*") //
.exposedHeaders("WWW-Authenticate") //
.allowCredentials(true)
.maxAge(TimeUnit.DAYS.toSeconds(1));
}
그리고 MVC의 경우:
@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CustomWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// enables CORS as per
// https://docs.spring.io/spring-security/site/docs/current/reference/html/cors.html#cors
http.cors()
.and() // ...
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
applyFullCorsAllowedPolicy(registry);
}
};
}
}
SDR의 경우:
public class CustomRepositoryRestMvcConfiguration extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setReturnBodyOnCreate(true);
config.setReturnBodyForPutAndPost(true);
config.setReturnBodyOnUpdate(true);
config.setMaxPageSize(250);
config.setDefaultPageSize(50);
config.setDefaultMediaType(MediaTypes.HAL_JSON);
config.useHalAsDefaultJsonMediaType(true);
CustomWebSecurityConfiguration.applyFullCorsAllowedPolicy(config.getCorsRegistry());
}
다음은 제가 다음과 같은 답을 도출하는 데 도움이 된 주제에 대한 추가 참조입니다.
- https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
- https://docs.spring.io/spring-security/site/docs/current/reference/html/cors.html
RepositoryRestConfigurerAdapter는 3.1에서 더 이상 사용되지 않으므로 위의 스프링 부트 및 데이터-레스트 버전 3.1을 사용한 경우 RepositoryRestConfigurer를 직접 구현할 수 있습니다.
@Configuration
public class ConfigRepositoryRest implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.getCorsRegistry()
.addMapping("/**")
.allowedOrigins("http://localhost:3000");
}
}
저는 스프링 휴게소를 각진 곳에서 치려고 했습니다.Tomcat 서버에 배치된 스프링 레스트 프로젝트이며 각도가 기본 각도 서버입니다.저는 이 문제가 각진 부분에서 서비스 부분까지 영향을 미칠 때 직면했습니다.나는 따르려고 노력했습니다.
https://juristr.com/blog/2016/11/configure-proxy-api-angular-cli/
하지만 여전히 문제가 있습니다.선배인 Abbasbhai 덕분에 스프링 구성 파일에 구성을 추가하여 이 문제를 방지할 것을 제안하여 스프링 구성에 이 코드를 추가했습니다.
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
@ComponentScan("org.liferayasif.backend")
public class RestConfig extends WebMvcConfigurerAdapter{
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
configurer.enable();
}
/*
* (non-Javadoc)
* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
* To avoid 'Access-Control-Allow-Origin'
* Above error arising when I am hitting from angular to our rest service
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
이 방법은 '액세스-컨트롤-오리진 허용' 코르스를 해결했습니다.
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
참고로 전체 프로젝트를 다운로드할 수 있습니다.
내 github URL 링크:
https://github.com/asifaftab87/SpringPersistenceHibernate
지점 - 보안
프로젝트 - 모델
언급URL : https://stackoverflow.com/questions/31724994/spring-data-rest-and-cors
'programing' 카테고리의 다른 글
UIImageView의 터치 이벤트를 감지하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
---|---|
'0+ptr'(0 + 포인터)은 무엇을 의미합니까? (0) | 2023.07.27 |
div 요소에서 키 누름(또는 키다운) 이벤트를 캡처하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
파이썬 함수(또는 코드를 직렬화)를 쉽게 피킹할 수 있는 방법이 있습니까? (0) | 2023.07.27 |
CSS로만 된 대문자? (0) | 2023.07.27 |