Springboot ajax+사용자 정의 headers 의 크로스 도 메 인 요청 문 제 를 해결 합 니 다.

1.도 메 인 을 뛰 어 넘 는 것 이 무엇 입 니까?
브 라 우 저 동원 정책(동원 정책)때문에 넷 스 케 이 프 가 제시 한 유명한 보안 정책 입 니 다.현재 자 바스 크 립 트 를 지원 하 는 모든 브 라 우 저 에서 이 정책 을 사용 합 니 다.동원 이란 도 메 인 이름,프로 토 콜,포트 가 같다 는 것 을 말한다.)요청 url 을 보 내 는 프로 토 콜,도 메 인 이름,포트 세 가지 중 하 나 는 현재 페이지 주소 와 다 르 면 크로스 필드 입 니 다.
구체 적 으로 다음 표를 볼 수 있다.

2.springboot 는 도 메 인 문 제 를 어떻게 해결 합 니까?
1.일반 크로스 도 메 인 요청 솔 루 션:
① 인터페이스 에 주석 추가 요청@CrossOrigin(origins="http://127.0.0.1:8020",maxAge=3600)
설명:origins="http://127.0.0.1:8020"origins 값 은 현재 이 인 터 페 이 스 를 요청 하 는 도 메 인 입 니 다.
② 유 니 버 설 설정(모든 인터페이스 에서 도 메 인 요청 허용)
configration 클래스 를 추가 하거나 애플 리 케 이 션 에 CorsFilter 와 CorsConfiguration 방법 을 추가 합 니 다.

@Configuration 
public class CorsConfig { 
  private CorsConfiguration buildConfig() { 
    CorsConfiguration corsConfiguration = new CorsConfiguration(); 
    corsConfiguration.addAllowedOrigin("*"); // 1        
    corsConfiguration.addAllowedHeader("*"); // 2     
    corsConfiguration.addAllowedMethod("*"); // 3      (post、get ) 
    return corsConfiguration; 
  } 

  @Bean 
  public CorsFilter corsFilter() { 
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
    source.registerCorsConfiguration("/**", buildConfig()); // 4 
    return new CorsFilter(source); 
  } 
} 
2.ajax 사용자 정의 headers 의 크로스 도 메 인 요청

$.ajax({
    type:"GET",
    url:"http://localhost:8766/main/currency/sginInState",
    dataType:"JSON",
    data:{
      uid:userId
    },
    beforeSend: function (XMLHttpRequest) {
      XMLHttpRequest.setRequestHeader("Authorization", access_token);
    },
    success:function(res){
      console.log(res.code)
    }
  })
이때 요청http://localhost:8766/main/currency/sginInState인터페이스 에서 OPTIONShttp://localhost:8766/main/currency/sginInState500 오류 가 발견 되 었 습 니 다.일반 도 메 인 을 뛰 어 넘 는 해결 방안 은 이런 문 제 를 해결 할 수 없습니다.왜 OPTIONS 요청 이 발생 했 습 니까?

원인.
브 라 우 저 는 실제 요청 을 보 내기 전에 OPTIONS 의 예비 검사 요청 Preflighted requests 를 보 냅 니 다.이 요청 은 이번 요청 이 안전 한 지 검증 하 는 데 사 용 됩 니 다.그러나 모든 요청 이 보 내 지 는 않 습 니 다.다음 조건 에 부합 해 야 합 니 다.
•요청 방법 은 GET/HEAD/POST 가 아 닙 니 다.
•POST 가 요청 한 Content-Type 은 application/x-www-form-urlencoded,multipart/form-data 또는 text/plain 이 아 닙 니 다.
•사용자 정의 header 필드 설정 요청
관리 단의 인터페이스 에 대해 저 는 인터페이스 에 대한 권한 검 사 를 할 수 있 습 니 다.요청 할 때마다 header 에 사용자 정의 필드(token)를 휴대 해 야 하기 때문에 브 라 우 저 는 OPTIONS 를 하나 더 보 내 서 이번 요청 의 안전성 을 검증 해 달라 고 요청 합 니 다.
왜 OPTIONS 요청 이 500 인가요?
OPTIONS 요청 은 사용자 정의 필드 만 가지 고 들 어가 지 않 습 니 다.배경 에서 token 필드 를 검사 할 때 token 은 NULL 이기 때문에 인증 이 통과 되 지 않 아 이상 을 던 졌 습 니 다.
그러면 우 리 는 지금 이런 문 제 를 해결 할 것 이다.
① spring boot 프로젝트 application.yml 에 추가
spring:
mvc:
dispatch-options-request: true
메모:이 솔 루 션 은 어떤 경우 에는 OPTIONS 문 제 를 해결 하지 못 할 수도 있 습 니 다.환경 문제 일 수도 있 고 복잡 한 사용자 정의 filter 필터 설정 문제 일 수도 있 습 니 다.
② 필터 설정 추가
첫 번 째 단계:핸드폰 RequestFilter 요청 필터 설정 클래스 는 Handler Interceptor 클래스 를 실현 해 야 합 니 다.Handler Interceptor 클래스 는 org.spring from work.web.servlet.Handler Interceptor 아래 에 있 습 니 다.
구체 적 인 코드 구현:

@Component
public class RequestFilter implements HandlerInterceptor {
  public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
    response.setHeader("Access-Control-Max-Age", "86400");
    response.setHeader("Access-Control-Allow-Headers", "Authorization");
    //    OPTIONS     
    if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
      response.setStatus(HttpStatus.NO_CONTENT.value());
      return false;
    }
    return true;
  }
}
두 번 째 단계:손 으로 MyWebConfiguration 을 쓰 려 면 WebMvcConfiguration Support 를 계승 해 야 합 니 다.
메모:WebMvcConfigurationSupport 는 2.x 버 전 이상 이 고 1.x 버 전 은 WebMvcConfigurationAdapter 입 니 다.
구체 적 인 코드 구현:

@Component
public class MyWebConfiguration extends WebMvcConfigurationSupport{
  @Resource
  private RequestFilter requestFilter;
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    //      
    registry.addInterceptor(requestFilter).addPathPatterns("/**");
  }
}

총결산
위 에서 말 한 것 은 소 편 이 소개 한 Springboot 에서 ajax+사용자 정의 headers 의 크로스 도 메 인 요청 문 제 를 해결 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기