小編給大家分享一下SpringBoot跨域的案例分析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供招遠企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、做網(wǎng)站、H5場景定制、小程序制作等業(yè)務(wù)。10年已為招遠眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。前言:公司的SpringBoot項目出于某種原因,經(jīng)常樣處理一些跨域請求。
一。以前通過查閱相關(guān)資料自己寫的一個處理跨域的類,如下。
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", "*"); //設(shè)置相應(yīng)頭 //跨域 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'); // 瀏覽器是會先發(fā)一次options請求,如果請求通過,則繼續(xù)發(fā)送正式的post請求 // 配置options的請求返回 if (hreq.getMethod().equals("OPTIONS")) { //如果發(fā)現(xiàn)該請求為OPTION,則直接返回(不需要進入系統(tǒng)),并且設(shè)置相應(yīng)信息 hresp.setStatus(200); // hresp.setContentLength(0); hresp.getWriter().write("OPTIONS returns OK"); return; } // Filter 只是鏈?zhǔn)教幚恚埱笠廊晦D(zhuǎn)發(fā)到目的地址。 chain.doFilter(request, response); } }
1.2 注冊一個配置類(Configuration),把上面定義的filter類注冊到上下文環(huán)境中
@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() 方法,因為該發(fā)法在doFilter()方法中會調(diào)用(可以理解就是Filter的doFilter()方法)。
處理過程也是接受到OPTION方法并相應(yīng)200并返回。
@Configuration @EnableAutoConfiguration public class CrossOriginconfig { @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); final CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); // 設(shè)置你要允許的網(wǎng)站域名,如果全允許則設(shè)為 * corsConfiguration.addAllowedOrigin("*"); // 如果要限制 HEADER 或 METHOD 請自行更改 corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); System.out.println("confi init"); return new CorsFilter(urlBasedCorsConfigurationSource); } }
三:個人對跨域問題的小結(jié)
瀏覽器在發(fā)送請求之前,最先檢測到跨域問題,并在發(fā)送跨域請求之前先發(fā)送了一個類型為OPTIONS的請求(請求地址不變,并且請求頭上攜帶了一些其他信息),該請求必須得到服務(wù)器響應(yīng)(請查CrossDomainFilter ),如果該請求沒有得到響應(yīng),則瀏覽器不會發(fā)送真正的請求了。
3.1 :瀏覽器發(fā)送的OPTION請求(試探性的請求)
備注: 有圖我們發(fā)現(xiàn)請求地址不變(),請求方法為OPTION,并且請求頭中攜帶了一些信息該信息可以表明我是一個跨域請求,并且請求的方式是POST。。
3.2 :服務(wù)器需要對該請求做出相應(yīng),(請查CrossDomainFilter )
1)首先設(shè)置相應(yīng)相應(yīng)頭(告訴瀏覽器我支持的跨域請求的一些信息)
2) 設(shè)置相應(yīng)狀態(tài)為200,并且返回數(shù)據(jù)(任意數(shù)據(jù))
3.3 :瀏覽器獲得到了OPTION請求的相應(yīng)(服務(wù)器接受跨域),故放心發(fā)送真正的請求,如下
1)對比OPTION請求,請求地址沒變^_^
2)對比請求方式該請求為POST. 并且POST請求在OPTIN中已經(jīng)告訴服務(wù)器了(Access-Control-Request-Method)。
3)對比OPTION請求的頭,該請求并沒有Access-Control-Allow-****的相關(guān)參數(shù)。
看完了這篇文章,相信你對SpringBoot跨域的案例分析有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
名稱欄目:SpringBoot跨域的案例分析-創(chuàng)新互聯(lián)
文章起源:http://m.kartarina.com/article8/ccgdip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站制作、手機網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站排名、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)