教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

如何實現(xiàn)跨域?說一下JSONP實現(xiàn)原理?

更新時間:2023年04月12日10時29分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓

  跨域指的是在一個域名下的網(wǎng)頁去請求另一個域名下的資源。同源策略是瀏覽器的一種安全限制,如果不同源,就不能直接進行通信。但是在實際開發(fā)中,經(jīng)常需要跨域請求資源,這時就需要采取一些方法來解決這個問題。

  常見的跨域解決方案包括:

  1.CORS(Cross-Origin Resource Sharing)跨域資源共享:這是一種官方推薦的跨域解決方案,需要在服務端設置響應頭,允許客戶端跨域請求資源。

  2.JSONP(JSON with Padding)跨域請求:這是一種兼容性比較好的跨域解決方案,它的原理是利用 script 標簽沒有跨域限制的特性,通過動態(tài)創(chuàng)建 script 標簽,再將請求的數(shù)據(jù)作為回調(diào)函數(shù)的參數(shù)返回給客戶端。

  JSONP的實現(xiàn)原理是:客戶端通過動態(tài)創(chuàng)建 script 標簽,將需要跨域請求的 URL 作為 script 標簽的 src 屬性值,并在 URL 中攜帶一個回調(diào)函數(shù)的名稱(一般為 callback 或 cb),服務端收到請求后,根據(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');

  服務端代碼:

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ā)送跨域請求,服務端接收到請求后,根據(jù)客戶端傳遞的回調(diào)函數(shù)名稱和需要返回的數(shù)據(jù),生成一個回調(diào)函數(shù)的調(diào)用,并返回給客戶端??蛻舳私邮盏巾憫?,執(zhí)行指定的回調(diào)函數(shù),從而獲取到跨域請求的數(shù)據(jù)。

0 分享到:
和我們在線交談!