ajax跨域問(wèn)題的解決方法:1、響應(yīng)頭添加Header允許訪問(wèn);2、jsonp只支持get請(qǐng)求不支持post請(qǐng)求;3、httpClient內(nèi)部轉(zhuǎn)發(fā);4、使用nginx搭建企業(yè)級(jí)接口網(wǎng)關(guān)方式。
成都創(chuàng)新互聯(lián)長(zhǎng)期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為巴宜企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),巴宜網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
相關(guān)免費(fèi)學(xué)習(xí)推薦:ajax(視頻)
ajax跨域問(wèn)題的解決方法:
解決方式1:響應(yīng)頭添加Header允許訪問(wèn)
跨域資源共享(CORS)Cross-Origin Resource Sharing
這個(gè)跨域訪問(wèn)的解決方案的安全基礎(chǔ)是基于"JavaScript無(wú)法控制該HTTP頭"
它需要通過(guò)目標(biāo)域返回的HTTP頭來(lái)授權(quán)是否允許跨域訪問(wèn)。
response.addHeader(‘Access-Control-Allow-Origin:*’);//允許所有來(lái)源訪問(wèn) response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允許訪問(wèn)的方式
解決方式2:jsonp 只支持get請(qǐng)求不支持post請(qǐng)求
用法:①dataType改為jsonp ②jsonp : "jsonpCallback"————發(fā)送到后端實(shí)際為http://a.a.com/a/FromServlet?userName=644064&jsonpCallback=jQueryxxx ③后端獲取get請(qǐng)求中的jsonpCallback ④構(gòu)造回調(diào)結(jié)構(gòu)
$.ajax({ type : "GET", async : false, url : "http://a.a.com/a/FromServlet?userName=644064", dataType : "jsonp",//數(shù)據(jù)類型為jsonp jsonp : "jsonpCallback",//服務(wù)端用于接收callback調(diào)用的function名的參數(shù) success : function(data) { alert(data["userName"]); }, error : function() { alert('fail'); } }); //后端 String jsonpCallback = request.getParameter("jsonpCallback"); //構(gòu)造回調(diào)函數(shù)格式j(luò)sonpCallback(數(shù)據(jù)) resp.getWriter().println(jsonpCallback+"("+jsonObject.toJSONString()+")");
JSONP實(shí)現(xiàn)原理
在同源策略下,在某個(gè)服務(wù)器下的頁(yè)面是無(wú)法獲取到該服務(wù)器以外的數(shù)據(jù)的,即一般的ajax是不能進(jìn)行跨域請(qǐng)求的。但 img、iframe 、script等標(biāo)簽是個(gè)例外,這些標(biāo)簽可以通過(guò)src屬性請(qǐng)求到其他服務(wù)器上的數(shù)據(jù)。利用<script>標(biāo)簽的開(kāi)放策略,我們可以實(shí)現(xiàn)跨域請(qǐng)求數(shù)據(jù),當(dāng)然這需要服務(wù)器端的配合。 Jquery中ajax的核心是通過(guò) XmlHttpRequest獲取非本頁(yè)內(nèi)容,而jsonp的核心則是動(dòng)態(tài)添加<script>標(biāo)簽來(lái)調(diào)用服務(wù)器提供的 js腳本。
當(dāng)我們正常地請(qǐng)求一個(gè)JSON數(shù)據(jù)的時(shí)候,服務(wù)端返回的是一串JSON類型的數(shù)據(jù),而我們使用 JSONP模式來(lái)請(qǐng)求數(shù)據(jù)的時(shí)候服務(wù)端返回的是一段可執(zhí)行的JavaScript代碼。因?yàn)閖sonp 跨域的原理就是用的動(dòng)態(tài)加載<script>的src ,所以我們只能把參數(shù)通過(guò)url的方式傳遞,所以jsonp的 type類型只能是get !
示例:
$.ajax({ url: 'http://192.168.10.46/demo/test.jsp', //不同的域 type: 'GET', // jsonp模式只有GET 是合法的 data: { 'action': 'aaron' }, dataType: 'jsonp', // 數(shù)據(jù)類型 jsonp: 'jsonpCallback', // 指定回調(diào)函數(shù)名,與服務(wù)器端接收的一致,并回傳回來(lái) })
其實(shí)jquery 內(nèi)部會(huì)轉(zhuǎn)化成
http://192.168.10.46/demo/test.jsp?jsonpCallback=jQuery202003573935762227615_1402643146875&action=aaron
然后動(dòng)態(tài)加載
<script type="text/javascript"src="http://192.168.10.46/demo/test.jsp?jsonpCallback= jQuery202003573935762227615_1402643146875&action=aaron"></script>
然后后端就會(huì)執(zhí)行jsonpCallback(傳遞參數(shù) ),把數(shù)據(jù)通過(guò)實(shí)參的形式發(fā)送出去。
使用JSONP 模式來(lái)請(qǐng)求數(shù)據(jù)的整個(gè)流程:客戶端發(fā)送一個(gè)請(qǐng)求,規(guī)定一個(gè)可執(zhí)行的函數(shù)名(這里就是 jQuery做了封裝的處理,自動(dòng)幫你生成回調(diào)函數(shù)并把數(shù)據(jù)取出來(lái)供success屬性方法來(lái)調(diào)用,而不是傳遞的一個(gè)回調(diào)句柄),服務(wù)器端接受了這個(gè) jsonpCallback函數(shù)名,然后把數(shù)據(jù)通過(guò)實(shí)參的形式發(fā)送出去
(在jquery 源碼中, jsonp的實(shí)現(xiàn)方式是動(dòng)態(tài)添加<script>標(biāo)簽來(lái)調(diào)用服務(wù)器提供的 js腳本。jquery 會(huì)在window對(duì)象中加載一個(gè)全局的函數(shù),當(dāng) <script>代碼插入時(shí)函數(shù)執(zhí)行,執(zhí)行完畢后就 <script>會(huì)被移除。同時(shí)jquery還對(duì)非跨域的請(qǐng)求進(jìn)行了優(yōu)化,如果這個(gè)請(qǐng)求是在同一個(gè)域名下那么他就會(huì)像正常的 Ajax請(qǐng)求一樣工作。)
解決方式3:httpClient內(nèi)部轉(zhuǎn)發(fā)
實(shí)現(xiàn)原理很簡(jiǎn)單,若想在B站點(diǎn)中通過(guò)Ajax訪問(wèn)A站點(diǎn)獲取結(jié)果,固然有ajax跨域問(wèn)題,但在B站點(diǎn)中訪問(wèn)B站點(diǎn)獲取結(jié)果,不存在跨域問(wèn)題,這種方式實(shí)際上是在B站點(diǎn)中ajax請(qǐng)求訪問(wèn)B站點(diǎn)的HttpClient,再通過(guò)HttpClient轉(zhuǎn)發(fā)請(qǐng)求獲取A站點(diǎn)的數(shù)據(jù)結(jié)果。但這種方式產(chǎn)生了兩次請(qǐng)求,效率低,但內(nèi)部請(qǐng)求,抓包工具無(wú)法分析,安全。
$.ajax({ type : "GET", async : false, url : "http://b.b.com:8080/B/FromAjaxservlet?userName=644064", dataType : "json", success : function(data) { alert(data["userName"]); }, error : function() { alert('fail'); } }); @WebServlet("/FromAjaxservlet") public class FromAjaxservlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { //創(chuàng)建默認(rèn)連接 CloseableHttpClient httpClient = HttpClients.createDefault(); //創(chuàng)建HttpGet對(duì)象,處理get請(qǐng)求,轉(zhuǎn)發(fā)到A站點(diǎn) HttpGet httpGet = new HttpGet("http://a.a.com:8080/A/FromServlet?userName="+req.getParameter("userName")); //執(zhí)行 CloseableHttpResponse response = httpClient.execute(httpGet); int code = response.getStatusLine().getStatusCode(); //獲取狀態(tài) System.out.println("http請(qǐng)求結(jié)果為:"+code); if(code == 200){ //獲取A站點(diǎn)返回的結(jié)果 String result = EntityUtils.toString(response.getEntity()); System.out.println(result); //把結(jié)果返回給B站點(diǎn) resp.getWriter().print(result); } response.close(); httpClient.close(); } catch (Exception e) { } } }
解決方式4:使用nginx搭建企業(yè)級(jí)接口網(wǎng)關(guān)方式
www.a.a.com不能直接請(qǐng)求www.b.b.com的內(nèi)容,可以通過(guò)nginx,根據(jù)同域名,但項(xiàng)目名不同進(jìn)行區(qū)分。什么意思呢?這么說(shuō)可能有點(diǎn)抽象。假設(shè)我們公司域名叫www.nginxtest.com
當(dāng)我們需要訪問(wèn)www.a.a.com通過(guò)www.nginxtest.com/A訪問(wèn),并通過(guò)nginx轉(zhuǎn)發(fā)到www.a.a.com
當(dāng)我們需要訪問(wèn)www.b.b.com通過(guò)www.nginxtest.com/B訪問(wèn),并通過(guò)nginx轉(zhuǎn)發(fā)到www.a.a.com
我們?cè)L問(wèn)公司的域名時(shí),是"同源"的,只是項(xiàng)目名不同,此時(shí)項(xiàng)目名的作用只是為了區(qū)分,方便轉(zhuǎn)發(fā)。如果你還不理解的話,先看看我是怎么進(jìn)行配置的:
server { listen 80; server_name www.nginxtest.com; location /A { proxy_pass http://a.a.com:81; index index.html index.htm; } location /B { proxy_pass http://b.b.com:81; index index.html index.htm; } }
我們?cè)L問(wèn)以www.nginxtest.com開(kāi)頭且端口為80的網(wǎng)址,nginx將會(huì)進(jìn)行攔截匹配,若項(xiàng)目名為A,則分發(fā)到a.a.com:81。實(shí)際上就是通過(guò)"同源"的域名,不同的項(xiàng)目名進(jìn)行區(qū)分,通過(guò)nginx攔截匹配,轉(zhuǎn)發(fā)到對(duì)應(yīng)的網(wǎng)址。整個(gè)過(guò)程,兩次請(qǐng)求,第一次請(qǐng)求nginx服務(wù)器,第二次nginx服務(wù)器通過(guò)攔截匹配分發(fā)到對(duì)應(yīng)的網(wǎng)址。
相關(guān)免費(fèi)學(xué)習(xí)推薦:javascript(視頻)
新聞名稱:ajax跨域問(wèn)題如何解決
本文來(lái)源:http://www.rwnh.cn/article26/cgpejg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、App開(kāi)發(fā)、商城網(wǎng)站、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)