前端最基礎的就是 HTML+CSS+Javascript
。掌握了這三門技術就算入門,但也僅僅是入門,現在前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS
),本着提升技術水平,打牢基礎知識的中心思想,我們開課啦(每週四)。
JSONP 跨域請求原理以及實現方式jQuery封裝的Ajax調用和JSONP數據跨域請求原理和實現
這節題目有點奇怪啊。
上節我們講了同源策略,這節我們講講如何跨域。這東西就和產品提需求一樣,我知道不合理,但是我就想要。
跨域分類
-
iframe 跨域
比如www.51vv.com
的一部分(header吧),我k.51vv.com
也想用。默認情況下不同源,是不允許的。那我們怎麼辦呢?- domain
- postMessage
-
ajax 跨域
- JSONP
- CORS
- 服務器代理
-
canvas 資源跨域
- image 跨域
-
script 資源跨域
- Script error.
爲了提升網站的訪問速度,我們通常都會將靜態資源文件(css, image, javascript)放在CDN。當這些從CDN的JavaScript腳本執行出錯,因爲違背了同源策略, 爲了保證用戶信息不被泄露,錯誤信息不會顯示出來,取而代之只會返回一個Script error.。
- Script error.
ajax 跨域方案
這部分知識是我們開發中經常會遇到的。下面我們來介紹一下常見的幾種方法。
JSONP 跨域方案
JSONP 優缺點
-
優點
- 瀏覽器兼容性強(全支持)
-
缺點
- 不安全(嵌入異常邏輯代碼)
- 只能發GET請求
JSONP 原理
下面我們來說一下JSONP的原理,順便分析一下上面的優缺點。
- 首先 script 標籤引入的代碼,不管跨不跨域都可以執行。常見的就是CDN的資源,我們拿來使用。
- 正常的JSON數據爲
{code: 200, res: [{id:1,state:0},{id:2,state:1}]}
。
如果我們 script 標籤引入的資源就是帶數據的。
比如console.log({code: 200, res: [{id:1,state:0},{id:2,state:1}]})
,這樣不就等於拿到了數據? - 服務端拼接callback名稱,動態生成返回數據。
從上面的原理看到JSONP就等於用script加載代碼。基於<script>
所以兼容性超級棒。同樣因爲基於<script>
代碼加載回來了就會執行,如果其中有惡意代碼很危險。
CORS 跨域方案
CORS 是一個 W3C 標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。
是用來處理跨域問題的一個標準方案。分爲兩種情況,簡單請求和非簡單請求。
優缺點
-
優點
- 一個標準化的方案。
- 對於 ajax 請求的方案。支持(get、post、put、delete)等多種請求方式。
- 包含多種跨域情況,比如script跨域,image跨域
- 安全。因爲他拿到的只是單純的數據,數據具體怎麼使用,還是由開發者來控制。
-
缺點
- 兼容性較弱(IE 低版本的時候還沒這個規範,所以不支持)
- 非簡單請求首次會預檢
簡單請求與非簡單請求的區分
只要同時滿足以下兩大條件,就屬於簡單請求。
- 請求方法是以下三種方法之一:
HEAD
、GET
、POST
-
HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
-
Content-Type
:只限於三個值-
application/x-www-form-urlencoded
、 multipart/form-data
text/plain
-
凡是不同時滿足上面兩個條件,就屬於非簡單請求。
OPTIONS
瀏覽器對於這兩種請求的處理流程是不一樣的。
-
處理流程的區別?
- 簡單請求:一次請求
- 非簡單請求:兩次請求,在發送數據之前會先發一次預檢(OPTIONS)請求,只有通過後纔會正式的發送請求用於數據傳輸。
-
預檢請求
- 請求方式(method):OPTIONS
-
檢查服務器是否支持對應的請求。
- 通過則允許傳輸數據
- 不通過則不再發送真正想要發送的消息(body)
-
如何預檢
- 如果複雜請求是PUT等請求,則服務端需要設置允許某請求,否則預檢不通過
Access-Control-Request-Method - 如果複雜請求設置了請求頭,則服務端需要設置允許某請求頭,否則預檢不通過
Access-Control-Request-Headers
- 如果複雜請求是PUT等請求,則服務端需要設置允許某請求,否則預檢不通過
服務器代理 跨域方案
跨域的前提還記得嗎?如果我們只請求當前域名不就沒問題了嗎?我問根據一定規則,讓服務端幫我們請求。
優缺點
-
優點
- 兼容極好
- 方便更換源
-
缺點
- 流量問題
- 需要主要安全問題,防止代理到內部服務器
nginx實現
server {
listen 80;
server_name proxy.lilnong.top;
location = /50x.html {
root html;
}
location /proxy {
proxy_pass http://8.8.8.8/;
}
}
意味着如果請求https://proxy.lilnong.top/proxy/index.html
就會被代理到http://8.8.8.8/index.html
;
這裏有個注意點,proxy_pass http://8.8.8.8/;
和proxy_pass http://8.8.8.8;
。前者會過濾掉location的匹配串,後者不會。
總結
ajax 的跨域目前基本依靠 CORS 來解決。
nginx 用於內網也是不錯的選擇。
jsonp在一些三方應用上表現還不錯。
當然,不管哪種方案都需要服務端的配置
微信公衆號:前端linong
初級階段文章目錄
- 前端培訓-初級階段(17) - 數據存儲(cookie、session、stroage)
- 前端培訓-初級階段(13) - 正則表達式
- 前端培訓-初級階段(13) - 類、模塊、繼承
- 前端培訓-初級階段(13) - ECMAScript (內置對象、函數)
- 前端培訓-初級階段(13) - ECMAScript (語法、變量、值、類型、運算符、語句)
- 前端培訓-初級階段(13、18)
- 前端培訓-初級階段(9 -12)
- 前端培訓-初級階段(5 - 8)
- 前端培訓-初級階段(1 - 4)
中級階段文章目錄
- 前端培訓-中級階段(2) - 事件(event) 事件冒泡、捕獲 - (2019-06-20期)
- 前端培訓-中級階段(3) - DOM 文檔對象模型(2019-06-27期)
- 前端培訓-中級階段(4)- BOM 瀏覽器對象模型(2019-07-04期)
- 前端培訓-中級階段(5)- jQuery的概念與基本使用(2019-07-11期)
- 前端培訓-中級階段(6)- jQuery元素節點操作(2019-07-18期)
- 前端培訓-中級階段(7)- jQuery的事件綁定鏈式操作及原理(2019-07-25期)
- 前端培訓-中級階段(8)- jQuery元素屬性樣式操作(2019-08-01期)
- 前端培訓-中級階段(9)- 原生Ajax的運行原理與實現(2019-08-08期)
- 前端培訓-中級階段(10)- 同源策略(2019-08-15期)
資料
- 前端培訓目錄、前端培訓規劃、前端培訓計劃
- 瀏覽器同源策略及跨域的解決方法
- Same-origin policy
-
Script error.全面解析
之前雖然也知道這個錯誤。但是沒有仔細看過。直到靜態資源上CDN,才發現了這個問題。 -
跨域資源共享 CORS 詳解 - 阮一峯的網絡日誌
記得當初是一個上傳功能,需要走統一上傳服務器發現了CORS和OPTIONS。就是在大佬這裏看懂的。