您好,登錄后才能下訂單哦!
小編給大家分享一下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跨域的案例分析有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。