摘要:服務端接收到請求后,通過該參數獲得回調函數名,并將數據放在參數中將其返回收到結果后因為是標簽,所以瀏覽器會當做是腳本進行運行,從而達到跨域獲取數據的目的。
在使用Vue搭建的一個后端管理系統(tǒng)中,我使用axios請求本地的Node環(huán)境下的接口,但是請求失敗,然后我錯誤信息是:
大概意思就是不能訪問http://localhost:8080
我的Vue項目端口是http://localhost:8081,Node服務端運行在http://localhost:8080端口上,也就是說因為請求端口和響應端口不一致,所以請求失敗。
我也在網上查看了一些關于跨域出現的原因及解決的方法,并記錄下來。
跨域一句話的理解就是:服務端和請求端的地址不一樣。什么是跨域
Ajax 的便利性大家都清楚,可以在不向服務器提交完整的頁面的情況下,實現局部更新頁面。但是瀏覽器處于對安全方面的考慮,不允許跨域調用其他頁面的對象。
其實這個也不能怪瀏覽器,假設誰都可以隨隨便便向你發(fā)送請求,那樣有很大的安全隱患。
根據瀏覽器的同源策略, 只有當協議,域名,端口相同的時候才算是同源, 反之則均視為是一個跨域的請求.
也就是說我剛剛的Vue端口是8081,服務端端口是8080,端口不一樣,因為同源策略的存在 ,所有我的請求會失敗。
一個問題,當找到了原因,這個問題就解決了一半了。怎么解決跨域
下面就先介紹三種跨全域的方法:
JSONP應該是最常見解決跨域的方法了,
他為什么能解決跨域呢,是因為Web 頁面上調用 js 文件不受瀏覽器同源策略的影響,所以通過 Script 便簽可以進行跨域的請求:
首先前端先設置好回調函數,并將其作為 url 的參數。
服務端接收到請求后,通過該參數獲得回調函數名,并將數據放在參數中將其返回
收到結果后因為是 script 標簽,所以瀏覽器會當做是3腳本進行運行,從而達到跨域獲取數據的目的。
我的前端是index.html,后端是server.js
后端邏輯:
//server.js const url = require("url"); const http = require("http"); http.createServer((req, res)=>{ const data = { x: 10//返回的數據 }; const callback = url.parse(req.url, true).query.callback; res.writeHead(200); res.end(`${callback}(${JSON.stringify(data)})`); //執(zhí)行回調函數,返回data }).listen(3000, "localhost"); console.log("啟動服務,監(jiān)聽 localhost:3000");
然后使用node server.js運行
前端:
//index.html
之后打開index.html;就可以在控制臺看到返回的數據了:
至此,通過 JSONP 跨域獲取數據已經成功了,jsonp這種方法跨域,他的兼容性很好,可以在古老的瀏覽器中國使用,因為這種方法是利用了標簽的特殊性,所有只支持GET請求。
CORSCORS 是一個 W3C 標準,全稱是"跨域資源共享"(Cross-origin resource sharing)它允許瀏覽器向跨源服務器,發(fā)出 XMLHttpRequest 請求,從而克服了 ajax 只能同源使用的限制。
CORS 需要瀏覽器和服務器同時支持才可以生效,對于開發(fā)者來說,CORS 通信與同源的 ajax 通信沒有差別,代碼完全一樣。瀏覽器一旦發(fā)現 ajax 請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。
因此,實現 CORS 通信的關鍵是服務器。只要服務器實現了 CORS 接口,就可以跨源通信。
前端:
這次前端啟動需要使用node-server來啟動,使用npm install node-server下載,然后當前目錄下使用node-server就可以了
后端:
const http = require("http"); http.createServer((req, res)=>{ const data = { "data": "Hello world"http://返回的數據 }; res.writeHead(200, {"Access-Control-Allow-Origin": "http://127.0.0.1:8080"}); //設置的頭部信息需要和前端請求的地址一致 res.end(JSON.stringify(data)); //返回data }).listen(3000, "127.0.0.1"); console.log("啟動服務,監(jiān)聽 127.0.0.1:3000");
使用命令node server.js啟動;
CORS與JSONP的使用目的相同,但是比JSONP更強大。
JSONP只支持GET請求,CORS支持所有類型的HTTP請求。JSONP的優(yōu)勢在于支持老式瀏覽器,以及可以向不支持CORS的網站請求數據。
Server Proxy服務器代理,顧名思義,當你需要有跨域的請求操作時發(fā)送請求給后端,讓后端幫你代為請求,然后最后將獲取的結果發(fā)送給你。
假設有這樣的一個場景,你的頁面需要獲取?CNode:Node.js專業(yè)中文社區(qū)?論壇上一些數據,如通過?https://cnodejs.org/api/v1/topics,當時因為不同域,所以你可以將請求后端,讓其對該請求代為轉發(fā)。
后端代碼如下:
const url = require("url"); const http = require("http"); const https = require("https"); http.createServer((req, res)=>{ const path = url.parse(req.url).path.slice(1); //核對請求路由是否一致 if(path === "topics"){ https.get("https://cnodejs.org/api/v1/topics", (resp)=>{ //https代發(fā)請求 let data=""; resp.on("data", chunk=>{ data+= chunk }); resp.on("end", ()=>{ res.writeHead( 200, {"Content-Type": "application/json; charset=utf-8"} ); res.end(data); //返回數據 }) }) } }).listen(3000, "127.0.0.1"); console.log("啟動服務,監(jiān)聽 127.0.0.1:3000");
前端代碼:
這樣就成功了
常用的跨域方式基本就是這三種:
JSONP
優(yōu)點是可以兼容老瀏覽器,缺點是只能發(fā)送GET請求
CORS
優(yōu)點簡單方便,支持post請求,缺點是需要后端的配合,不支持老版瀏覽器。。
Server Proxy
優(yōu)點是前端正常發(fā)送ajax請求,缺點是后端會二次請求。
其他的跨域方式還有:location.hash、window.name、postMessage等方式,有時間也可以了解一下。
參考資料:
跨域資源共享 CORS 詳解[阮一峰的博客]:http://www.ruanyifeng.com/blo...
關于跨域,你想知道的全在這里:https://zhuanlan.zhihu.com/p/...
不要再問我跨域的問題了[sf]:https://segmentfault.com/a/11...
關于跨域,以及跨域的幾種方式[cnblog]:https://www.cnblogs.com/chens...
瀏覽器的同源策略[MDN]:https://developer.mozilla.org...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/102557.html
摘要:在接觸前端開發(fā)起,跨域這個詞就一直以很高的頻率在我們學習工作中重復出現,最近在工作中遇到了跨域的相關問題,這里我把它總結記錄一下。 在接觸前端開發(fā)起,跨域這個詞就一直以很高的頻率在我們學習工作中重復出現,最近在工作中遇到了跨域的相關問題,這里我把它總結記錄一下。關于跨域,有N種類型,現在我只專注于ajax請求跨域(ajax跨域只是屬于瀏覽器同源策略中的一部分,其它的這里不做介紹),內容...
摘要:背景后端使用并更改本地文件,起本地服務。使用調用后端接口,要求為格式,并要求在里加一些內容。借用凝雨關于跨域踩坑經驗總結 背景 后端使用Nginx并更改本地host文件,起本地服務。將aaa.bbbb.com代理至本地IP地址(10.26.36.156)。使用$.ajax調用后端restful接口,要求content-type為application/json格式,并要求在reques...
摘要:跨域問題相信跨域問題是每個前端在請求中都會遇到的問題因為瀏覽器的同源策略的限制所以是不支持跨域的當然當后臺在沒有完成搭建的時候這時候我們需要使用到模擬數據的時候這時候很多的就會出現跨域問題在中當然這個問題也不例外如下所以在此我也就整理出了 跨域問題 相信跨域問題是每個前端在ajax請求中都會遇到的問題,因為瀏覽器的同源策略的限制,所以ajax是不支持跨域的,當然當后臺在沒有完成搭建的...
閱讀 1909·2021-11-18 13:21
閱讀 2038·2021-10-18 13:30
閱讀 1631·2021-10-12 10:13
閱讀 997·2021-10-09 09:43
閱讀 5522·2021-09-22 15:13
閱讀 3636·2021-08-11 10:22
閱讀 992·2019-08-30 13:46
閱讀 3572·2019-08-30 13:21