SpringBoot 크로스 도 메 인 요청 차단 문제 코드 인 스 턴 스 해결

머리말
동원 정책:동원 여 부 를 판단 하 는데 주로 이 세 가지 점,프로 토 콜,ip,포트 를 봅 니 다.
동원 전략 은 브 라 우 저가 사이트 의 안전성 을 고려 하여 서로 다른 자원 의 상호 방문 을 제한 하 는 정책 이다.
도 메 인 이름https://www.baidu.com스 크 립 트 에 접근 할 수 없습니다.https://www.sina.com원본 자원 입 니 다.그렇지 않 으 면 브 라 우 저 에 의 해 차단 됩 니 다.
두 가지 주의:
1.AJAX 요청 같은 스 크 립 트 요청 이 어야 합 니 다.
그러나 다음 과 같은 상황 에 서 는 크로스 오 버 차단 이 발생 하지 않 습 니 다.

<img src="xxx"/>
<a href='xxx"> </a>
2.크로스 도 메 인 차단 은 전단 요청 이 보 내 졌 고 백 엔 드 에서 응답 을 되 돌 릴 때 관련 매개 변 수 를 검사 하 며 백 엔 드 요청 을 받 을 수 있 는 지 여부 입 니 다.
마이크로 서비스 개발 에 있어 한 시스템 은 여러 개의 마이크로 서 비 스 를 포함 하고 크로스 도 메 인 요청 장면 이 존재 합 니 다.
본 고 는 주로 SpringBoot 가 크로스 오 버 요청 차단 문 제 를 해결 하 는 것 을 설명 한다.
건설 프로젝트
웹 프로젝트 두 개,웹 1 과 웹 2 를 만 듭 니 다.
웹 2 프로젝트 는 웹 1 프로젝트 의 자원 을 요청 합 니 다.
여기에 핵심 코드 만 붙 이 고 전체 코드 참조GitHub
WEB2
html 페이지 로 돌아 가 는 컨트롤 러 를 만 듭 니 다.

@Slf4j
@Controller
public class HomeController {
@RequestMapping("/index")
public String home(){
log.info("/index");
return "/home";
}
}
html 페이지 home.html
단 추 를 만 들 었 습 니 다.단 추 를 누 르 면 자원 을 요청 합 니 다:http://localhost:8301/hello

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>web2</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>
<script>
$(function () {
$("#testBtn").click(function () {
console.log("testbtn ...");
$.get("http://localhost:8301/hello",function(data,status){
alert("  : " + data + "
: " + status); }); }) }) </script> </head> <body> web2 <button id="testBtn"> </button> </body> </html>
WEB1

@Slf4j
@RestController
public class Web1Controller {
@RequestMapping("/hello")
public String hello(){
log.info("hello ");
return "hello," + new Date().toString();
}
}
두 항목 을 다른 포트 로 설정 합 니 다.
WEB 1 은 8301 입 니 다.
WEB 2 는 8302 입 니 다.
그래서 서로 다른 기원 이다.
테스트
웹 1 에 도 메 인 접근 을 허용 하 는 설정 이 없 는 경우
단 추 를 누 르 면 오류 가 발생 합 니 다.헤더 에 Access-Control-Allow-Origin 이 없 음 표시

Access to XMLHttpRequest at 'http://localhost:8301/hello' from origin 'http://localhost:8300' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
WEB 1 은 웹 MvcConfigure 를 통 해 크로스 도 메 인 요청 을 추가 합 니 다.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/hello");
}
}
다시 방문 하면 정상 데 이 터 를 되 돌려 줍 니 다.

이상 의 설정 외 에 더욱 세밀 한 제한 을 할 수 있다.
예 를 들 어 요청 한 headers,요청 한 방법 POST/GET...요청 한 원본 을 제한 합 니 다.

위의 설정 을 바 꾸 기 위해 서 는 주해@CrossOrigin 을 사용 할 수 있 습 니 다.

@Slf4j
@RestController
public class Web1Controller {
@CrossOrigin
@RequestMapping("/hello")
public String hello(){
log.info("hello ");
return "hello," + new Date().toString();
}
}
주 해 는 클래스 에 도 사용 할 수 있 고 방법 에 도 사용 할 수 있 지만 컨트롤 러 클래스 여야 합 니 다.
설정 은 위 와 마찬가지 로 방법,header,소스 에 대해 개성 화 된 제한 을 할 수 있 습 니 다.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
/** @deprecated */
@Deprecated
String[] DEFAULT_ORIGINS = new String[]{"*"};
/** @deprecated */
@Deprecated
String[] DEFAULT_ALLOWED_HEADERS = new String[]{"*"};
/** @deprecated */
@Deprecated
boolean DEFAULT_ALLOW_CREDENTIALS = false;
/** @deprecated */
@Deprecated
long DEFAULT_MAX_AGE = 1800L;
@AliasFor("origins")
String[] value() default {};
@AliasFor("value")
String[] origins() default {};
String[] allowedHeaders() default {};
String[] exposedHeaders() default {};
RequestMethod[] methods() default {};
String allowCredentials() default "";
long maxAge() default -1L;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기