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