淺析JavaScript如何解決跨域問題并手寫一個jsonp
跨域是指瀏覽器為了安全性,實施的同源策略。同源策略要求,只有協(xié)議、域名和端口號完全相同的網(wǎng)頁,才能共享資源。如果不滿足這些條件,就會產(chǎn)生“跨域”。
解決跨域的常見方法有以下幾種:
1.CORS(跨源資源共享) :服務(wù)器設(shè)置相應(yīng)的 HTTP 頭部 Access-Control-Allow-Origin。這是最常用的跨域解決方案。
// 服務(wù)器端設(shè)置 HTTP 頭部
res.setHeader('Access-Control-Allow-Origin', '*');
2.JSONP(JSON with Padding) :通過動態(tài)創(chuàng)建 <script> 標(biāo)簽來調(diào)用服務(wù)器提供的回調(diào)函數(shù)。這種方法只能用于 GET 請求。
// 客戶端
function handleResponse(data) {
console.log(data);
}
const script = document.createElement('script');
script.src = 'http://www.domain.com?callback=handleResponse';
document.body.insertBefore(script, document.body.firstChild);
// 服務(wù)器端
res.end(`handleResponse(${JSON.stringify(data)})`);
3.代理服務(wù)器:通過后端服務(wù)器轉(zhuǎn)發(fā)請求和響應(yīng),避免瀏覽器直接請求不同源的資源。
// Node.js 服務(wù)器端
const request = require('request');
app.get('/proxy', function(req, res) {
const url = 'http://www.domain.com' + req.url;
req.pipe(request(url)).pipe(res);
});
4.PostMessage:HTML5 引入的一種新的 API,可以實現(xiàn)跨源通信。
// 頁面 A
window.postMessage('message', 'http://www.domain-b.com');
// 頁面 B
window.addEventListener('message', function(event) {
if (event.origin !== 'http://www.domain-a.com') return;
console.log(event.data);
}, false);
5.WebSockets:WebSockets 是一種通信協(xié)議,由于其是雙向通信,且在建立連接后可以直接發(fā)送數(shù)據(jù),因此不受同源策略限制。
以上就是解決跨域問題的常見方法,需要根據(jù)具體的場景和需求來選擇合適的方法。
JSONP(JSON with Padding)是一種跨域數(shù)據(jù)交互的方法。它的基本思想是,網(wǎng)頁通過添加一個 <script> 標(biāo)簽,向服務(wù)器請求 JSON 數(shù)據(jù),這種做法不受同源策略限制;服務(wù)器收到請求后,將數(shù)據(jù)放在一個指定名字的 JavaScript 函數(shù)中返回。
以下是一個 JSONP 的基本實現(xiàn):
// 客戶端
function jsonp(url, callback) {
// 創(chuàng)建 script 標(biāo)簽并加入到頁面中
var script = document.createElement('script');
script.type = 'text/javascript';
// 創(chuàng)建一個全局函數(shù),并將函數(shù)名傳給服務(wù)器請求
var callbackName = 'jsonp_callback_' + Math.random().toString().replace('.', '');
window[callbackName] = function(data) {
// 在這個全局函數(shù)中處理服務(wù)器返回的數(shù)據(jù)
callback(data);
// 數(shù)據(jù)處理完后刪除此函數(shù)及 script 標(biāo)簽
delete window[callbackName];
document.body.removeChild(script);
}
// 設(shè)置請求 URL
script.src = url + '?callback=' + callbackName;
document.body.appendChild(script);
}
// 使用 JSONP
jsonp('http://www.example.com', function(data) {
console.log(data);
});
在這個例子中,客戶端創(chuàng)建了一個全局函數(shù),并將函數(shù)名作為參數(shù)傳給服務(wù)器。服務(wù)器將數(shù)據(jù)放在這個函數(shù)中返回??蛻舳说娜趾瘮?shù)收到數(shù)據(jù)后進(jìn)行處理。
請注意,JSONP 只能用于 GET 請求,不能發(fā)送 POST 或其他類型的 HTTP 請求。而且,由于它是通過插入 <script> 標(biāo)簽來工作的,所以如果服務(wù)器被惡意利用,可能會有安全問題。
到此這篇關(guān)于淺析JavaScript如何解決跨域問題并手寫一個jsonp的文章就介紹到這了,更多相關(guān)JavaScript跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript函數(shù)和作用域(經(jīng)典面試題)
文章系統(tǒng)梳理了JavaScript中的核心函數(shù)概念,包括閉包、詞法作用域與動態(tài)作用域的區(qū)別、call/apply/bind方法、高階函數(shù)、箭頭函數(shù)、生成器、防抖節(jié)流技術(shù)、遞歸優(yōu)缺點、純函數(shù)及函數(shù)重載與偏函數(shù),感興趣的朋友跟隨小編一起看看吧2025-09-09
JavaScript設(shè)置獲取和設(shè)置屬性的方法
這篇文章主要介紹了JavaScript設(shè)置獲取和設(shè)置屬性的方法,學(xué)會使用getAttribute、setAttribute的用法,需要的朋友可以參考下2015-03-03
ionic+html5+API實現(xiàn)雙擊返回鍵退出應(yīng)用
這篇文章主要為大家詳細(xì)介紹了ionic+html5+API實現(xiàn)雙擊返回鍵退出應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
JavaScript隨機(jī)數(shù)的組合問題案例分析
這篇文章主要介紹了JavaScript隨機(jī)數(shù)的組合問題,結(jié)合具體案例形式分析了JavaScript隨機(jī)數(shù)的組合問題相關(guān)算法原理、實現(xiàn)技巧與注意事項,需要的朋友可以參考下2020-05-05
CocosCreator經(jīng)典入門項目之flappybird
這篇文章主要介紹了CocosCreator經(jīng)典入門項目之flappybird,詳細(xì)說明了制作的每個步驟,還有詳盡的代碼,對CocosCreator感興趣的同學(xué),一定要看一下2021-04-04

