更新時間:2023年04月12日10時29分 來源:傳智教育 瀏覽次數(shù):
跨域指的是在一個域名下的網(wǎng)頁去請求另一個域名下的資源。同源策略是瀏覽器的一種安全限制,如果不同源,就不能直接進行通信。但是在實際開發(fā)中,經(jīng)常需要跨域請求資源,這時就需要采取一些方法來解決這個問題。
常見的跨域解決方案包括:
1.CORS(Cross-Origin Resource Sharing)跨域資源共享:這是一種官方推薦的跨域解決方案,需要在服務(wù)端設(shè)置響應(yīng)頭,允許客戶端跨域請求資源。
2.JSONP(JSON with Padding)跨域請求:這是一種兼容性比較好的跨域解決方案,它的原理是利用 script 標(biāo)簽沒有跨域限制的特性,通過動態(tài)創(chuàng)建 script 標(biāo)簽,再將請求的數(shù)據(jù)作為回調(diào)函數(shù)的參數(shù)返回給客戶端。
JSONP的實現(xiàn)原理是:客戶端通過動態(tài)創(chuàng)建 script 標(biāo)簽,將需要跨域請求的 URL 作為 script 標(biāo)簽的 src 屬性值,并在 URL 中攜帶一個回調(diào)函數(shù)的名稱(一般為 callback 或 cb),服務(wù)端收到請求后,根據(jù)參數(shù)進行處理,并將處理結(jié)果作為一個參數(shù)傳遞給客戶端指定的回調(diào)函數(shù),最后返回給客戶端的內(nèi)容為回調(diào)函數(shù)的調(diào)用,并將處理結(jié)果作為參數(shù)傳遞進去,這樣客戶端就可以獲取到跨域請求的數(shù)據(jù)了。
下面是一個簡單的 JSONP 實現(xiàn)示例:
客戶端代碼:
function jsonp(url, callback) { const script = document.createElement('script'); script.src = url + '?callback=' + callback; document.body.appendChild(script); } function handleData(data) { console.log(data); } jsonp('http://example.com/api/data', 'handleData');
服務(wù)端代碼:
const http = require('http'); http.createServer((req, res) => { const callback = req.query.callback; const data = { name: 'ChatGPT', age: 1 }; const result = callback + '(' + JSON.stringify(data) + ')'; res.end(result); }).listen(3000);
在這個例子中,客戶端通過調(diào)用jsonp函數(shù)發(fā)送跨域請求,服務(wù)端接收到請求后,根據(jù)客戶端傳遞的回調(diào)函數(shù)名稱和需要返回的數(shù)據(jù),生成一個回調(diào)函數(shù)的調(diào)用,并返回給客戶端。客戶端接收到響應(yīng)后,執(zhí)行指定的回調(diào)函數(shù),從而獲取到跨域請求的數(shù)據(jù)。