1. 程式人生 > 其它 >同源策略跨域防抖節流

同源策略跨域防抖節流

同源

同源概念兩個頁面的協議,域名和埠(預設是80埠)都相同,則兩個頁面具有相同的源。

同源策略:是瀏覽器提供的一個安全功能

通俗的理解:瀏覽器規定,A 網站的 JavaScript,不允許和非同源的網站 C 之間,進行資源的互動,例如:

① 無法讀取非同源網頁的 Cookie、LocalStorage 和 IndexedDB

② 無法接觸非同源網頁的 DOM

③ 無法向非同源地址傳送 Ajax 請求

跨域

跨域概念:兩個 URL 的協議、域名、埠任何一項或者多項不一樣,則是跨域,與同源相反

出現跨域的根本原因:瀏覽器的同源策略不允許非同源的 URL 之間進行資源的互動

瀏覽器對跨域請求的攔截

注意:瀏覽器允許發起跨域請求,但是,跨域請求回來的資料,會被瀏覽器攔截,無法被頁面獲取到

如何實現跨域資料請求

現如今,實現跨域資料請求,最主要的兩種解決方案,分別是 JSONP(前端方案CORS(後端方案

JSONP出現的早,相容性好(相容低版本IE)。是前端程式設計師為了解決跨域問題,被迫想出來的一種臨時解決方案缺點只支援 GET 請求,不支援 POST 請求。

CORS出現的較晚,它是 W3C 標準,屬於跨域 Ajax 請求的根本解決方案。支援 GETPOST 請求。缺點是不相容某些低版本的瀏覽器

JSONP

JSONP (JSON with Padding

) 是 JSON 的一種“使用模式”,可用於解決主流瀏覽器的跨域資料訪問的問題。

JSONP的實現原理:通過 <script> 標籤的 src 屬性,請求跨域的資料介面,並通過函式呼叫的形式,接收跨域介面響應回來的資料

示列:發起Ajax跨域請求

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5   <meta charset="UTF-8">
 6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7
<meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>Document</title> 9 <script src="./lib/jquery.js"></script> 10 </head> 11 12 <body> 13 <script> 14 $.ajax({ 15 method: 'GET', 16 url: 'http://www.liulongbin.top:3006/api/jsonp', 17 data: { 18 name: 'zs', 19 age: 20 20 }, 21 success: function (res) { 22 console.log(res) 23 } 24 }) 25 </script> 26 </body> 27 28 </html>

jQuery中的JSONP

jQuery 提供的 $.ajax() 函式,除了可以發起真正的 Ajax 資料請求之外,還能夠發起 JSONP 資料請求,例如:

1 $.ajax({
2      url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
3      // 如果要使用 $.ajax() 發起 JSONP 請求,必須指定 datatype 為 jsonp
4      dataType: 'jsonp',
5      success: function(res) {
6      console.log(res)
7      }
8 })

預設情況下,使用 jQuery 發起 JSONP 請求,會自動攜帶一個 callback=jQueryxxx 的引數,jQueryxxx 是隨機生成的一個回撥函式名稱

自定義引數及回撥函式名稱

在使用 jQuery 發起 JSONP 請求時,如果想要自定義 JSONP引數以及回撥函式名稱,可以通過如下兩個引數來指定:

 1 $.ajax({
 2      url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
 3      dataType: 'jsonp',
 4      // 傳送到服務端的引數名稱,預設值為 callback
 5      jsonp: 'callback',
 6      // 自定義的回撥函式名稱,預設值為 jQueryxxx 格式
 7      jsonpCallback: 'abc',
 8      success: function(res) {
 9      console.log(res)
10      }
11 })

jQueryJSONP的實現過程

jQuery 中的 JSONP,也是通過 <script> 標籤的 src 屬性實現跨域資料訪問的,只不過,jQuery 採用的是動態建立和移除標籤的方式,來發起 JSONP 資料請求

  • 在發起 JSONP 請求的時候,動態向 <header> 中 append 一個 <script> 標籤;

  • JSONP 請求成功以後,動態從 <header> 中移除剛才 append 進去的 <script> 標籤;

示列如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5   <meta charset="UTF-8">
 6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8   <title>Document</title>
 9   <script src="./lib/jquery.js"></script>
10 </head>
11 
12 <body>
13   <button id="btnJSONP">發起JSONP資料請求</button>
14   <script>
15     $(function () {
16       $('#btnJSONP').on('click', function () {
17         $.ajax({
18           url: 'http://liulongbin.top:3006/api/jsonp?address=北京&location=順義',
19           // 傳送到服務端的引數名稱,預設值為 callback
20           dataType: 'jsonp',
21           // 自定義的回撥函式名稱,預設值為 jQueryxxx 格式
22           jsonpCallback: 'abc',
23           success: function (res) {
24             console.log(res)
25           }
26         })
27       })
28     })
29   </script>
30 </body>
31 
32 </html>

防抖&節流