🎉使用JSONP解決跨域

来源:https://www.cnblogs.com/Lucky-daisy/archive/2022/05/16/16279108.html
-Advertisement-
Play Games

1.首先需要知道什麼事跨域 瀏覽器從一個功能變數名稱的網頁去請求另一個功能變數名稱的資源時,功能變數名稱、埠、協議任一不同,都是跨域 出於瀏覽器的同源策略限制 同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同 源策略,則瀏覽器的正常功能可能都會受到影響 同源策略限制 ...


 

1.首先需要知道什麼事跨域

  • 瀏覽器從一個功能變數名稱的網頁去請求另一個功能變數名稱的資源時,功能變數名稱、埠、協議任一不同,都是跨域

  • 出於瀏覽器的同源策略限制
    • 同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同 源策略,則瀏覽器的正常功能可能都會受到影響
  • 同源策略限制內容有:
    • Cookie、LocalStorage、IndexedDB 等存儲性內容
    • DOM 節點
    • AJAX 請求發送後,結果被瀏覽器攔截了

2.什麼是JSONP

  • JSONP是JSON with Padding的略稱,JSONP為民間提出的一種跨域解決方案,通過客戶端的script標簽發出的請求方式
  • 原理就是通過添加一個<script>標簽,向伺服器請求JSON數據,這樣不受同源政策限制。伺服器收到請求後,將數據放在一個callback回調函數中傳回來。比如axios。不過只支持GET請求且不安全,可能遇到XSS攻擊,不過它的好處是可以向老瀏覽器或不支持CORS的網站請求數據
  • 服務端: 將服務端返回數據封裝到指定函數中返回 callback({返回數據})
  • 客戶端: 不管是我們的script標簽的src還是img標簽的src,或者說link標簽的href他們沒有被同源策略所限制,比如我們有可能使用一個網路上的圖片,就可以請求得到;所以利用同源策略漏洞,將訪問地址放在下麵的標簽的路徑中,<script src="www.baidu.com"> 、< img src=""/>、 <link href=""/> 來解決跨域的問題

3.JSONP簡單實現

node伺服器端代碼 

   const express = require('express')
   const app = express()
   const port = 3000

   //路由配置
   app.get("/user",(req,res)=>{
      //1.獲取客戶端發送過來的回調函數的名字
      let fnName = req.query.callback;
      //2.得到要通過JSONP形式發送給客戶端的數據
      const data = {name:'tom'}
      //3.根據前兩步得到的數據,拼接出個函數調用的字元串
      let result = `${fnName}({name:"tom"})`
      //4.把上步拼接得到的字元串,響應給客戶端的<script> 標簽進行解析執行
      res.send(result);
   })

   app.listen(port, () => {
      console.log(`Example app listening on port ${port}`)
   })

前端代碼

<head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>JSONP簡單實現</title>
   </head>
      <body>
         <button id="btn">點擊發送請求</button>
         <script>
            function getJsonpData(data) {
               console.log("獲取數據成功")
               console.log(data) //{name:'tom'}
            }
            var btn = document.getElementById("btn");
            btn.onclick = function () {
               //創建script標簽
               var script = document.createElement("script");
               script.src = 'http://localhost:3000/user?callback=getJsonpData';
               document.body.appendChild(script);
               script.onload = function () {
                  document.body.removeChild(script)
               }
            }
         </script>
      </body>
   </html>

4.結論

  • 優點:
    • 相容性比較好,可用於解決主流瀏覽器的跨域數據訪問的問題
    • 不受到同源策略的限制,在請求完畢後可以通過調用 callback 的方式回傳結果
  • 缺點:
    • 僅支持get請求;
    • 具有局限性,不安全,可能會受到XSS攻擊;
    • 只支持跨域 HTTP 請求這種情況,不能解決不同域的兩個頁面之間如何進行 Javascript 調用的問題




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫升級,是一項讓人喜憂參半的工程。喜的是,通過升級,可以享受新版本帶來的新特性及性能提升。憂的是,新版本可能與老的版本不相容,不相容主要體現在以下三方面: 語法不相容。 語義不相容。同一個SQL,在新老版本執行結果不一致。 新版本的查詢性能更差。 所以,在對線上資料庫進行升級之前,一般都會在測試 ...
  • 本文介紹如何使用 SQL GROUP BY 子句分組數據,以便彙總表內容的子集。這涉及兩個新 SELECT 語句子句:GROUP BY 子句和 HAVING 子句。 一、數據分組 從 如何使用 SQL AVG、COUNT、MAX、MIN 和 SUM 彙總數據 中得知,使用 SQL 聚集函數可以彙總數 ...
  • 本文為大家展示如何用低代碼實現一個簡單的頁面跳轉功能,讓你一看就會,一做就對! ...
  • 5月18日晚19:00,Hello HarmonyOS進階系列應用篇第三課《游戲開發實踐》直播如約而至。 ...
  • 編者按:在 OpenHarmony 生態發展過程中,涌現了大批優秀的代碼貢獻者,本專題旨在表彰貢獻、分享經驗,文中內容來自嘉賓訪談,不代表 OpenHarmony 工作委員會觀點。 李俊剛 深圳開鴻數字產業發展有限公司 資深OS驅動開發工程師 開源之風盛行,有人站在門口躍躍欲試,有人已經進場大展身手 ...
  • Gradle 作為官方主推的構建系統,目前已經深度應用於 Android 的多個技術體系中,例如組件化開發、產物構建、單元測試等。可見,要成為 Android 高級工程師 Gradle 是必須掌握的知識點。在這篇文章里,我將帶你由淺入深建立 Gradle 的基本概念,涉及 Gradle 生命周期、P... ...
  • 華為運動健康服務(HUAWEI Health Kit)提供原子化數據開放,在獲取用戶對數據的授權後,應用可通過介面訪問運動健康數據,對用戶數據進行增、刪、改、查等操作,為用戶提供運動健康類數據服務。這篇文章中我們總結了開發者提出的授權相關的典型問題並給出了參考解決方法,希望為其他遇到類似問題的開發者 ...
  • 學完vue2還是決定先做一個比較經典,也比較大的項目來練練手好一點,vue3的知識不用那麼著急,先把vue2用熟練了,vue3隨時都能學。 這個項目確實很經典包含了登錄註冊、購物車電商網站該有的都有,後面還會結合elementUI構件後臺管理界面。拭目以待! 一.初始化腳手架環境 vue creat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...