搜尋
首頁Javajava教程SpringBoot跨域的介紹(程式碼範例)

這篇文章帶給大家的內容是關於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中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器