Spring Boot 크로스 도 메 인 요청 실현

18904 단어 spring-boot
Spring Boot 크로스 도 메 인 요청 실현
  • 1. 안내
  • 2. 도 메 인 을 뛰 어 넘 는 두 가지 방식
  • JSONP 크로스 도 메 인
  • CORS 크로스 도 메 인
  • 3. Spring Boot 설정 크로스 도 메 인
  • 3.1. 방법 에 @ CrossOrigin 주 해 를 추가 하면 이 인터페이스 에 만 유효 합 니 다.
  • 3.2. 클래스 에 @ CrossOrigin 주 해 를 추가 하고 이 클래스 의 인터페이스 에 만 유효 합 니 다.
  • 3.3, 전역 설정, 추가 설정 클래스 WebMvcConfig. java, 이 응용 프로그램 에 유효 합 니 다:
  • 4. 원리 에 대한 간단 한 분석
  • 참조 연결
  • 프로필
        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 크로스 도 메 인 요청 문제 해결

    좋은 웹페이지 즐겨찾기