摘要:前言由于自己平時只做做,并沒有遇到太多跨域問題,今天通過幾個樣例模擬實現了幾種跨域方式。
前言
由于自己平時只做做demo,并沒有遇到太多跨域問題,今天通過幾個樣例模擬實現了幾種跨域方式。原文地址 傳送門
本文所有樣例靜態服務器基于nodejs實現,代碼親測可用。測試步驟如下:
1.為了實現跨域訪問的效果,需要下載http-server 作為一個服務器 npm install http-server。用來掛載靜態頁面 index.html 。(訪問http://127.0.0.1:8080 顯示index.html頁面)
2.運行node創建的靜態服務器node server (node搭建靜態服務向下翻)
說道跨域可能最先想到就時 jsonp ,實現原理為:同源策略只限制瀏覽器的行為而不限制js,所以可以將請求寫到 script 標簽中。關鍵代碼如下:
前端發出跨域請求數據后,服務端去解析該請求:
const data={...} const callback = req.parse(req.url,true).query.callback res.writeHead(200) //最關鍵的一步,拼接回調函數和作為函數參數的數據data res.end(`${callback}(${JSON.stringfy(data)})`)
瀏覽器接收到服務端返回的響應,由于發起請求的是script,相當于直接調用方法并傳入參數
具體實現案例(服務端代碼,node.js)
const url = require("url"); require("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)})`); }).listen(3000, "127.0.0.1"); console.log("服務器已啟動...");
(前端)
JSONP解決Ajax跨域問題
如果是采用js原生,可以參考傳送門
CORS跨域實現CORS跨域的思想為:CORS通信和Ajax同源請求沒有區別,關鍵在于服務端的配置。要想實現CORS通信,服務端必須要設置一個自定義頭Access-Control-Origin:""來允許跨域訪問
(樣例僅做了一個最簡單的GET請求demo服務端代碼)
require("http").createServer((req,res)=>{ res.writeHead(200,{ "Access-Control-Allow-Origin":"http://127.0.0.1:8080" }) res.end("這是來自端口3000的信息,收好了~") }).listen(3000,"127.0.0.1")
(前端代碼)
cors實現跨域的優點是不但能實現 GET , POST 等簡單請求,還能實現 PUT 等非簡單請求跨域
ServerProxy服務器代理ServerProxy服務器代理實現跨域的核心思想是:將跨域請求操作發送給服務端,由服務端代為請求,然后將請求結返回過來
這里以獲取 CNode:Node.js專業中文社區 論壇上一些數據為場景。如通過 https://cnodejs.org/api/v1/to...,當時因為不同域,所以你可以將請求后端,讓其對該請求代為轉發。
const url = require("url") const http = require("http") const https = require("https") const server = 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) => { 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("服務器已啟動...");postMessage
postMessage是HTML5新增的一項功能,postMessage() 方法允許來自不同源的腳本采用異步方式進行有限通信可以實現跨文本文檔,多窗口,跨域消息傳遞。
利用postMessage不能和服務端交換數據,只能在兩個窗口 之間交換數據
postMessage(data,origin)方法接收兩個參數
data:html5規范中提到該參數可以是JavaScript的任意基本類型或可復制的對象.然而并不是所有瀏覽器都做到了這點兒,部分瀏覽器只能處理字符串參數,所以我們在傳遞參數的時候需要使用JSON.stringify()方法對對象參數序列化
oringin:字符串參數,指明目標窗口的源,協議+主機+端口號[+URL],URL會被忽略。這個參數是為了安全考慮,postMessage()方法只會將message傳遞給指定窗口,當然如果愿意也可以建參數設置為"*",這樣可以傳遞給任意窗口,如果要指定和當前窗口同源的話設置為"/"
創建一個postMsg.html,創建一個iframe。使用postMessage可以向 http://127.0.0.1:8081 發送消息,然后監聽 message ,可以獲得其他文檔發來的消息
(創建recieve.html文件)
安全性: postMessage 采用的是 雙向安全機制 。發送方發送數據時,會確認接收方的源,而監聽方監聽到 message 事件后,也可以用 event.origin 判斷是否來自于正確可靠的發送方
webSocket實現跨域websocket是一中全雙工通信協議,該協議不實行同源政策,只要服務器支持,就可以通過它進行跨源通信
websocket的應用實例:https://segmentfault.com/a/11...
對于主域相同跨子域的情況,可以通過設置 document.domain 來解決。具體做法是在 example.com/a.html 和 sub.example.com/b.html 兩個文件分別加上 document.domain = example.com
然后通過a.html 文件創建一個iframe,去控制iframe的 window,從而進行交互
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91801.html
摘要:跨域是瀏覽器攔截了服務器端返回的相應,不是攔截了請求。通過來實現跨域使用來實現跨域可以解決下不能跨域的問題,僅僅支持請求服務端多加一個參數,在返回數據時用把具體的數據包裹起來,傳回前端。 項目開發為了支持web瀏覽器ajax的直接請求,涉及到了跨域的需求,通過學習對跨域有了更深入的認識,現在總結一下: 1.跨域說明 跨域指請求和服務的域不一致,瀏覽器和H5的ajax請求有影響,而對服務...
摘要:跨域是瀏覽器攔截了服務器端返回的相應,不是攔截了請求。通過來實現跨域使用來實現跨域可以解決下不能跨域的問題,僅僅支持請求服務端多加一個參數,在返回數據時用把具體的數據包裹起來,傳回前端。 項目開發為了支持web瀏覽器ajax的直接請求,涉及到了跨域的需求,通過學習對跨域有了更深入的認識,現在總結一下: 1.跨域說明 跨域指請求和服務的域不一致,瀏覽器和H5的ajax請求有影響,而對服務...
摘要:大家都知道可以通過實現跨域。第一種方式在服務下添加一個實現跨域,實現起來方便。前端服務和后端服務在同一臺服務器上,服務調用服務時,服務通過負載均衡進入服務時時,服務的請求跨域成功,時,服務的請求跨域失敗。 大家都知道spring boot 可以通過@CrossOrigin實現跨域。但是在spring cloud 里,如果要粒度那么細的去控制跨域,這個就太繁瑣了,所以一般來說,會在路由z...
閱讀 3035·2021-11-12 10:36
閱讀 4777·2021-09-22 10:57
閱讀 1585·2021-09-22 10:53
閱讀 2676·2019-08-30 15:55
閱讀 3505·2019-08-29 17:00
閱讀 3362·2019-08-29 16:36
閱讀 2478·2019-08-29 13:46
閱讀 1357·2019-08-26 11:45