Spring Boot 크로스 도 메 인 요청 실현
18904 단어 spring-boot
CORS 는 W3C 기준 으로 '크로스 - origin resource sharing' (Cross - origin resource sharing) 이 라 고 불 린 다.브 라 우 저가 크로스 소스 서버 에 XML HttpRequest 요청 을 할 수 있 도록 해 AJAX 가 같은 소스 로 만 사용 할 수 있 는 제한 을 극복 했다.CORS 는 브 라 우 저 와 서버 가 동시에 지원 해 야 합 니 다.현재 모든 브 라 우 저 는 이 기능 을 지원 하 며 IE 브 라 우 저 는 IE 10 보다 낮 을 수 없습니다. 브 라 우 저 동원 정책 (동원 정책, 넷 스 케 이 프 가 제안 한 유명한 보안 정책 입 니 다. 현재 자 바스 크 립 트 를 지원 하 는 모든 브 라 우 저 는 이 정책 을 사용 합 니 다. 동원 이란 도 메 인 이름, 프로 토 콜, 포트 가 같 습 니 다.) 요청 url 을 보 내 는 협의, 도 메 인 이름, 포트 세 가지 중 하 나 는 현재 페이지 주소 와 다 르 면 크로스 도 메 인 입 니 다.
2. 도 메 인 을 뛰 어 넘 는 두 가지 방식 을 실현 한다.
JSONP 크로스 필드
JSONP 는 JSON with padding (충전 식 JSON 또는 매개 변수 식 JSON) 의 약자 다.JSONP 가 크로스 도 메 인 요청 을 실현 하 는 원 리 는 쉽게 말 하면 'script' 탭 을 동적 으로 만 든 다음 에 'script' 의 src 를 이용 하여 같은 소스 정책 으로 부터 제약 을 받 지 않 고 크로스 도 메 인 에서 데 이 터 를 얻 는 것 입 니 다. JSONP 는 두 부분 으로 구성 되 어 있 습 니 다. 리 셋 함수 와 데이터 입 니 다.리 셋 함 수 는 응답 이 왔 을 때 페이지 에서 호출 해 야 할 함수 입 니 다.리 셋 함수 의 이름 은 일반적으로 요청 에서 지정 합 니 다.데 이 터 는 리 셋 함수 에 들 어 오 는 JSON 데이터 다. 여기 서 이것 을 자세히 말 하지 않 겠 습 니 다. 관심 이 있 으 면 아래 의 이 글 을 보 세 요. JSONP 크로스 오 버 요청 쉽게 처리
CORS 크로스 필드
W3C 는 브 라 우 저 동원 문 제 를 해결 하기 위해 크로스 소스 자원 공유, 즉 CORS (Cross - Origin Resource Sharing) 를 제시 했다.
3. Spring Boot 설정 크로스 필드
주로 @ CrossOrigin 주 해 를 사용 하여 이 루어 집 니 다. 원본 코드 는 다음 과 같 습 니 다.
...
@Target({ElementType.METHOD, ElementType.TYPE})// ,
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
...
@AliasFor("origins")//
String[] value() default {};
...
long maxAge() default -1L;// ( )。
}
3.1 방법 에 @ CrossOrigin 주 해 를 추가 하면 이 인터페이스 에 만 유효 합 니 다.
@CrossOrigin(origins = "http://localhost:8080",maxAge = 3600)
@RequestMapping("/test")
String test() {
...
}
3.2 클래스 에 @ CrossOrigin 주 해 를 추가 하면 이 클래스 의 인터페이스 에 만 유효 합 니 다.
@CrossOrigin(origins = "http://localhost:8080",maxAge = 3600)
@RestController
public class UserController {
...
}
3.3 전역 설정, 설정 클래스 WebMvcConfig. java 를 추가 하여 이 응용 프로그램 에 유효 합 니 다.
/**
* @author Macky
* @Title class WebMvConfig
* @Description: TODO
* @date 2019/8/2 13:52
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}
필터 도 추가 할 수 있 습 니 다. CORS 규칙 을 지정 하고 어떤 인터페이스 에 효과 가 있 는 지 지정 할 수 있 습 니 다.
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:8080");
config.addAllowedOrigin("null");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config); // CORS
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
4. 원리 에 대한 간단 한 분석
Spring cors 의 검증 은 모두 DefaultCorsProcessor 클래스 의 processRequest () 방법 에 의 해 이 루어 집 니 다. 핵심 코드 는 다음 과 같 습 니 다.
public boolean processRequest(@Nullable CorsConfiguration config, HttpServletRequest request, HttpServletResponse response) throws IOException {
if (!CorsUtils.isCorsRequest(request)) {//1. “Origin” header,,
return true;
} else {
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response);
if (this.responseHasCors(serverResponse)) {//2. response header “Access-Control-Allow-Origin”
logger.trace("Skip: response already contains \"Access-Control-Allow-Origin\"");
return true;
} else {
ServletServerHttpRequest serverRequest = new ServletServerHttpRequest(request);
if (WebUtils.isSameOrigin(serverRequest)) {//3.
logger.trace("Skip: request is from same origin");
return true;
} else {
boolean preFlightRequest = CorsUtils.isPreFlightRequest(request);
if (config == null) {//4. CORS , , , , , , 。 , 。
if (preFlightRequest) {
this.rejectRequest(serverResponse);
return false;
} else {
return true;
}
} else {
return this.handleInternal(serverRequest, serverResponse, config, preFlightRequest);
}
}
}
}
}
참조 연결
SpringBoot 설정 Cors 크로스 도 메 인 요청 문제 해결
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Keycloak이 Active Directory에 등록된 사용자로 인증할 수 있도록 합니다.사내 시스템을 출시함에 있어서, 전회사에서는 Web시스템마다 로그인하고 있어 혐오가 있었으므로, 꼭 싱글 사인온으로 하고 싶다고 생각했다. 그 실현에, 옛날 조금만 평가한 OpenAM라든지의 정보를 구구어 낚시하기 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.