首頁  >  文章  >  Java  >  SpringBoot跨域的介紹(程式碼範例)

SpringBoot跨域的介紹(程式碼範例)

不言
不言轉載
2019-02-22 13:12:163298瀏覽

這篇文章帶給大家的內容是關於SpringBoot跨域的介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言:公司的SpringBoot專案出於某種原因,經常樣處理一些跨域請求。

一。以前透過查閱相關資料自己寫的一個處理跨域的類,如下。

1.1先定義一個filter(攔截所有請求,包括跨域請求)

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),把上面定義的filter類別註冊到上下文環境中

@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;
    }
}

#備註:這個配置類別主要解決我們寫的filter(CrossDomainFilter )攔截那些請求

二. SpringBoot自己的解決跨域的Filter(CorsFilter) ,該filter的源碼很簡單,可直接查看還類的doFilterInternal() 方法,因為該發法在doFilter()方法中會調用(可以理解就是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);
    }
}

三:個人對跨域問題的小結

     瀏覽器在傳送請求之前,先偵測到跨域問題,並在發送跨域請求之前先發送了一個類型為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刪除