這篇文章主要介紹了Spring Boot 2.0.2+Ajax如何解決跨域請(qǐng)求,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司溝通電話:13518219792,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),成都創(chuàng)新互聯(lián)公司網(wǎng)頁制作領(lǐng)域10年,包括成都濕噴機(jī)等多個(gè)方面擁有豐富的網(wǎng)站制作經(jīng)驗(yàn),選擇成都創(chuàng)新互聯(lián)公司,為企業(yè)錦上添花。
問題描述
后端域名為A.abc.com,前端域名為B.abc.com。瀏覽器在訪問時(shí),會(huì)出現(xiàn)跨域訪問。瀏覽器對(duì)于javascript的同源策略的限制。
HTTP請(qǐng)求時(shí),請(qǐng)求本身會(huì)返回200,但是返回結(jié)果不會(huì)走success,并且會(huì)在瀏覽器console中提示:
已攔截跨源請(qǐng)求:同源策略禁止讀取位于 https://www.baidu.com/ 的遠(yuǎn)程資源。(原因:CORS 頭缺少 ‘Access-Control-Allow-Origin')。
解決方案
1.jsonp
2.引用A站的js
3.Nginx做A站的反向代理
4.后端服務(wù)放開跨域請(qǐng)求
其中,以最后兩種見常。
詳細(xì)方案
本文主要描述第四種解決方案:后端服務(wù)放開跨域請(qǐng)求。
spring boot中放開跨域請(qǐng)求很簡(jiǎn)單。
1.增加一個(gè)configuration類
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * 跨域訪問配置 * @author wencst * @creation 2017年8月18日 */ @Configuration public class CustomCORSConfiguration { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } }
增加此類以后,非同源http訪問可以正常進(jìn)行了,但是會(huì)不會(huì)有什么問題呢?
對(duì)于大部分網(wǎng)站依然需要使用cookie作為前后端傳輸數(shù)據(jù)的媒介,然而默認(rèn)非同源請(qǐng)求是不攜帶cookie信息的。
2.服務(wù)端允許跨域攜帶cookie信息
在spring boot2.0.2中,允許跨域設(shè)置比較簡(jiǎn)單,只需增加一個(gè)configuration類即可。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * 跨域訪問配置 * @author wencst * @creation 2017年8月18日 */ @Configuration public class CustomCORSConfiguration { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.addExposedHeader("Content-Type"); corsConfiguration.addExposedHeader( "X-Requested-With"); corsConfiguration.addExposedHeader("accept"); corsConfiguration.addExposedHeader("Origin"); corsConfiguration.addExposedHeader( "Access-Control-Request-Method"); corsConfiguration.addExposedHeader("Access-Control-Request-Headers"); corsConfiguration.setAllowCredentials(true); return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } }
增加信息后,在前端依然需要調(diào)整AJAX請(qǐng)求,才能在非同源請(qǐng)求中攜帶cookie信息。
3.前端調(diào)整
$.ajax({ url: 'http://beta.roboming.com/api.php?s=/Public/AdminLogin.html', type: 'POST', async:true, xhrFields:{ withCredentials:true }, data: { username:userName, password:pwd }, success: function(respon){ console.log(respon); var res=eval(respon); }, error: function(){ alert('服務(wù)器發(fā)生錯(cuò)誤!'); } });
此時(shí),當(dāng)前端向后端服務(wù)做跨域請(qǐng)求時(shí),增加
xhrFields:{ withCredentials:true },
就會(huì)帶上cookie信息了,同理會(huì)帶上token/sessionID等等內(nèi)容。
測(cè)試方法
spring boot中增加一個(gè)controller
@Controller public class LoginController { @RequestMapping(value = "setString") @ResponseBody public String setString(HttpServletRequest request, HttpServletResponse response,@RequestParam String value) { request.getSession().setAttribute("username", value); return "OK"; } @RequestMapping(value = "getString") @ResponseBody public String getString(HttpServletRequest request, HttpServletResponse response) { String username = (String)request.getSession().getAttribute("username"); return username; } }
增加一個(gè)index.html,來訪問跨域訪問。
<html> <head> <meta charset="utf-8"> <title>跨域請(qǐng)求</title> <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script> </head> <body> <button onclick="set()">set</button> <br><br> <button onclick="get()">get</button> <script> function set(){ $.ajax({ url:'http://wencst.vicp.net/setString?value=10', xhrFields:{ withCredentials:true }, success:function(result){ alert(result); } }); } function get(){ $.ajax({ url:'http://wencst.vicp.net/getString', xhrFields:{ withCredentials:true }, success:function(result){ alert(result); } }); } </script> </body> </html>
html文件可以單獨(dú)本地訪問即可出現(xiàn)效果,并不一定要形成服務(wù)訪問。
當(dāng)服務(wù)端不允許跨域訪問時(shí),html文件訪問均報(bào)錯(cuò),并調(diào)用失敗。
當(dāng)服務(wù)端允許跨域訪問時(shí),html請(qǐng)求訪問成功。
當(dāng)服務(wù)端開啟cookie傳遞,并在html文件中增加 xhrFields參數(shù)時(shí),session生效
。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Boot 2.0.2+Ajax如何解決跨域請(qǐng)求”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
分享文章:SpringBoot2.0.2+Ajax如何解決跨域請(qǐng)求
當(dāng)前網(wǎng)址:http://m.rwnh.cn/article8/jdigip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、做網(wǎng)站、小程序開發(fā)、App開發(fā)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)