最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSONP解決同源策略限制引起跨域問題原理

 更新時間:2023年08月04日 10:31:14   作者:Qing  
這篇文章主要為大家介紹了JSONP解決同源策略限制引起跨域問題原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

同源策略的限制引起跨域問題

同源策略

為了解決跨域問題,大家利用script標簽請求src指向的資源不受同源策略限制的特性來進行資源的請求,這種方式就是JSONP。

接口實現(xiàn)

我們可以利用script標簽請求資源不受同源策略限制的特性,可以自己簡單的封裝一個jsonp請求函數(shù)。
首先在js代碼中手動創(chuàng)建script標簽,把需要請求的資源放到src屬性上,然后把script標簽加入到body標簽里面,在解析html的過程中就會執(zhí)行,當執(zhí)行完script并且請求到資源后,后端結(jié)果會以函數(shù)調(diào)用的的形式返回字符串類型的響應(yīng)結(jié)果,這個形式的具體結(jié)構(gòu)為函數(shù)名稱(函數(shù)實參),和平時我們在調(diào)用函數(shù)時沒有區(qū)別,然后頁面就會執(zhí)行后端返回的函數(shù)。

這里有個問題,頁面會調(diào)用后端返回的函數(shù),那么這個函數(shù)在哪里定義?

當然是要在本地的js代碼里面定義這個函數(shù),然后等待后端傳遞的參數(shù),這個參數(shù)其實就是我們想要的返回結(jié)果。

// 簡單寫個序列化函數(shù),不要就結(jié)是否考慮全面
function stringify(params) {
  let res = "";
  if (!params || typeof params !== "object") {
    throw new Error("請傳遞參數(shù)對象");
  }
  Object.keys(params).forEach((key) => {
    res += `&${key}=${params[key]}`;
  });
  return res.slice(1);
}
function jsonp({ url, params }) {
  return new Promise((resolve) => {
    const callback = `jsonp_${Math.ceil(Math.random() * 10000)}`;
    const script = document.createElement("script");
    script.src = `${url}?${stringify({ callback, ...params })}`;
    document.body.appendChild(script);
    // 一般情況下,函數(shù)的定義放置在window對象上,否則在調(diào)用函數(shù)的時候會找不到定義的實現(xiàn)
    window[callback] = function (data) {
      if (window[callback]) {
        delete window[callback];
      }
      document.body.removeChild(script);
      resolve(data);
    };
  });
}

發(fā)送JSONP請求

利用封裝的jsonp發(fā)起請求

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>jsonp請求</title>
  </head>
  <body>
    <button>點我就會biubiubiu地發(fā)送請求</button>
  </body>
  <script>
    const button = document.querySelector("button");
    button.onclick = function () {
      jsonp({ url: "http://localhost:8888" }).then(console.log);
    };
  </script>
</html>

服務(wù)端處理JSONP請求

jsonp請求需要服務(wù)端配合,約定查詢參數(shù)callback是在本地定義好的函數(shù),根據(jù)傳遞過來的callback返回其函數(shù)調(diào)用,并把數(shù)據(jù)通過實參的方式返回給客戶端。

const http = require("http");
const url = require("url");
const qs = require("querystring");
const server = http.createServer((req, res) => {
  const { query } = url.parse(req.url);
  const params = qs.parse(query);
  if (params.callback) {
    const data = `${params.callback}(${JSON.stringify({ a: 1, b: 2 })})`;
    res.end(data);
  }
});
server.listen(8888, () => {
  console.log("server is listen 8888");
});

以上就是JSONP解決同源策略限制引起跨域問題原理的詳細內(nèi)容,更多關(guān)于JSONP同源策略跨域限制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 聊聊Javascript中try catch的2個作用

    聊聊Javascript中try catch的2個作用

    try...catch 可以測試代碼中的錯誤,try 部分包含需要運行的代碼,而catch部分包含錯誤發(fā)生時運行的代碼,這篇文章主要給大家介紹了關(guān)于Javascript中try catch的2個作用,需要的朋友可以參考下
    2021-09-09
  • js實現(xiàn)簡單拼圖游戲

    js實現(xiàn)簡單拼圖游戲

    這篇文章主要為大家詳細介紹了js實現(xiàn)簡單拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript清空數(shù)組的四種方法

    JavaScript清空數(shù)組的四種方法

    這篇文章主要介紹了JavaScript清空數(shù)組的四種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • JavaScript比較當前時間是否在指定時間段內(nèi)的方法

    JavaScript比較當前時間是否在指定時間段內(nèi)的方法

    這篇文章主要介紹了JavaScript比較當前時間是否在指定時間段內(nèi)的方法,涉及javascript時間與字符串的轉(zhuǎn)換及比較操作相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • js對象合并的4種方式與數(shù)組合并的4種方式

    js對象合并的4種方式與數(shù)組合并的4種方式

    這篇文章主要介紹了js對象合并的4種方式與數(shù)組合并的4種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 一文讓你快速了解JavaScript棧

    一文讓你快速了解JavaScript棧

    這篇文章主要介紹了一文讓你快速了解JavaScript棧,棧全稱為堆棧,是一種先進后出的的數(shù)據(jù)結(jié)構(gòu),棧中只有兩種基本操作,也就是插入和刪除,也就是入棧和出棧操作,棧只有一端可以進行入棧和出棧操作,我們將其稱為棧頂,另一端稱其為棧底
    2022-07-07
  • 微信小程序收貨地址API兼容低版本解決方法

    微信小程序收貨地址API兼容低版本解決方法

    這篇文章主要介紹了微信小程序收貨地址API兼容低版本解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JS檢測數(shù)組類型的方法小結(jié)

    JS檢測數(shù)組類型的方法小結(jié)

    這篇文章主要介紹了js檢測數(shù)組類型的方法小結(jié),有instanceof方法Array.isArray() 方法和Object.prototype.toString.call()方法,都是比較常用的,需要的朋友可以參考下
    2017-03-03
  • 微信小程序?qū)崿F(xiàn)評價功能

    微信小程序?qū)崿F(xiàn)評價功能

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)評價功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • js實現(xiàn)掃雷源代碼

    js實現(xiàn)掃雷源代碼

    這篇文章主要為大家詳細介紹了js實現(xiàn)掃雷源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論

巴青县| 安徽省| 南京市| 汝州市| 蒙阴县| 大港区| 克什克腾旗| 安溪县| 老河口市| 黔东| 涿州市| 青海省| 桃园县| 化德县| 辽源市| 河北省| 托克逊县| 舒城县| 巴彦县| 英超| 庆城县| 沛县| 游戏| 青海省| 新乡市| 闵行区| 昂仁县| 永寿县| 泰宁县| 隆林| 南丰县| 赞皇县| 吉水县| 忻州市| 宜昌市| 万荣县| 安阳县| 玉树县| 武汉市| 西贡区| 丰都县|