>  기사  >  Java  >  SpringBoot 크로스 도메인 소개(코드 예)

SpringBoot 크로스 도메인 소개(코드 예)

不言
不言앞으로
2019-02-22 13:12:163261검색

이 기사는 SpringBoot 크로스 도메인(코드 예제)에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있습니다. 도움이 필요한 친구가 될 수 있기를 바랍니다.

서문: 어떤 이유로 회사의 SpringBoot 프로젝트는 종종 일부 도메인 간 요청을 처리합니다.

하나. 과거에 관련 정보를 참고하여 크로스 도메인 처리를 처리하는 클래스를 다음과 같이 작성했습니다.

1.1 먼저 필터를 정의합니다(도메인 간 요청을 포함한 모든 요청 차단)

public class CrossDomainFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {     
        HttpServletRequest hreq = (HttpServletRequest) request;  //
        HttpServletResponse hresp = (HttpServletResponse) response; 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*");  //设置相应头
        //跨域 Header
        hresp.setHeader("Access-Control-Allow-Methods", "*");
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,x-requested-with,requesttype");
        //header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype');
        // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
        // 配置options的请求返回
        if (hreq.getMethod().equals("OPTIONS")) {  //如果发现该请求为OPTION,则直接返回(不需要进入系统),并且设置相应信息
            hresp.setStatus(200);
            // hresp.setContentLength(0);
            hresp.getWriter().write("OPTIONS returns OK");
            return;
        }
        // Filter 只是链式处理,请求依然转发到目的地址。
        chain.doFilter(request, response);
    }
}

1.2 구성 클래스(Configuration)를 등록하고 위에서 정의한 필터 클래스를 컨텍스트 환경에 등록합니다

@Configuration
public class WebConfiguration {
    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }
    @Bean
    public FilterRegistrationBean<CrossDomainFilter> testFilterRegistration() {
        FilterRegistrationBean<CrossDomainFilter> registration = new FilterRegistrationBean<CrossDomainFilter>();
        registration.setFilter(new CrossDomainFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    }
}

Remarks: 이 구성 클래스는 주로 우리가 작성한 필터(CrossDomainFilter)로 해당 요청을 가로채는 문제를 해결합니다.

2. SpringBoot의 크로스 도메인 필터(CorsFilter)에 대한 자체 솔루션은 이 필터의 소스 코드가 매우 간단합니다. 이 메소드는 doFilter() 메소드에서 호출되기 때문에 동일한 클래스 메소드의 doFilterInternal()을 직접 볼 수 있습니다(Filter의 doFilter() 메소드라고 이해할 수 있습니다).

처리 프로세스에서도 OPTION 메서드를 허용하고 200으로 응답하고 반환합니다.

@Configuration
@EnableAutoConfiguration
public class CrossOriginconfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 设置你要允许的网站域名,如果全允许则设为 *
        corsConfiguration.addAllowedOrigin("*");
        // 如果要限制 HEADER 或 METHOD 请自行更改
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        System.out.println("confi init");
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

3: 교차 도메인 문제에 대한 개인 요약

요청을 보내기 전에 브라우저는 먼저 교차 도메인 문제를 감지하고 교차 도메인 요청을 보내기 전에 OPTIONS 유형의 요청을 보냅니다(요청 주소 변경되지 않고 요청 헤더에 다른 정보가 포함됨) 요청은 서버에서 응답해야 합니다(CrossDomainFilter를 확인하세요). 요청이 응답을 받지 못하면 브라우저는 실제 요청을 보내지 않습니다.

3.1: 브라우저에서 보낸 OPTION 요청(임시 요청)

비고: 그림에서 요청 주소는 변경되지 않고(), 요청 방법은 OPTION이고 요청 헤더에 일부 정보가 포함되어 있음을 확인했습니다. . 도메인 간 요청을 하고 있으며 요청 방법이 POST임을 알 수 있습니다. .

3.2: 서버는 요청에 응답해야 합니다. (CrossDomainFilter를 확인하세요.)

1) 먼저 해당 헤더를 설정합니다(제가 지원하는 도메인 간 요청에 대한 정보를 브라우저에 알려줍니다)

2) 해당 상태를 설정합니다. ~ 200 및 반환 데이터(임의 데이터)

3.3: 브라우저가 OPTION 요청에 대한 응답을 얻었으므로(서버는 교차 도메인을 허용합니다) 다음과 같이 실제 요청을 자유롭게 보내십시오.

1 ) OPTION 요청과 비교하여 요청 주소가 변경되지 않았습니다 ^_^

2) 요청 방법을 비교하면 요청은 POST이며 POST 요청은 OPTIN(Access-Control-Request-Method)에서 서버에 전달되었습니다. ).

3) OPTION 요청의 헤더를 비교하면 이 요청에는 Access-Control-Allow-**** 관련 매개변수가 없습니다.

위 내용은 SpringBoot 크로스 도메인 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제