1. 程式人生 > >web是如何實現跨域的

web是如何實現跨域的

跨域是指從一個域名的網頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源。跨域的嚴格一點的定義是:只要 協議,域名,埠有任何一個的不同,就被當作是跨域
瀏覽器有同源策略本身是禁止跨域訪問的
為什麼瀏覽器要限制跨域訪問呢?原因就是安全問題:如果一個網頁可以隨意地訪問另外一個網站的資源,那麼就有可能在客戶完全不知情的情況下出現cookie洩露的安全問題
為什麼要跨域:
既然有安全問題,那為什麼又要跨域呢? 有時公司內部有多個不同的子域,比如一個是location.company.com ,而應用是放在app.company.com , 這時想從 app.company.com去訪問 location.company.com 的資源就屬於跨域

怎麼實現跨域:
由於瀏覽器一般不對script,img等進行跨域限制,所以我們有機會通過script的方式來實現跨域訪問。
簡單來說,就是你請求的檔案,只要含有“src”,“href”這些屬性,你就能在其他伺服器上,請求你所需要的檔案,然後在自己的伺服器上執行,就實現了跨域(跨協議,跨域名,跨埠)。
凡是擁有scr這個屬性的標籤都可以跨域例如<script><img><iframe>,herf屬性的有<a>
具體做法:
1. 基於script標籤實現跨域,在頭部寫請求的資源地址:
<script type="text/javascript" src="http://web.cn/js/message.js"></script> 返回的是json資料
2. 基於jQuery傳送Ajax,在Ajax裡面設定datatype為jsonp(伺服器返回的資料格式),則可以進行跨域訪問,不過Ajax中type必須是get,因為jsonp只支援get
3.還有ifram請求
基於iframe實現的跨域要求兩個域具有aa.xx.com,bb.xx.com 這種特點,例如:http://a.study.cn/a.html 請求 http://b.study.cn/b.html
也就是兩個頁面必須屬於一個基礎域(例如都是xxx.com),使用同一協議和同一埠,這樣在兩個頁面中同時新增document.domain,就可以實現父頁面呼叫子頁面的函式

實現跨域的話服務端需要做什麼:
服務端要檢查訪問的請求引數,如果沒有callback,則可以按照之前的流程走;如果帶著callback引數,則需要將返回的結果包裝在callback裡面。

1、jsonp跨域 
JSONP(JSON with Padding:填充式JSON),應用JSON的一種新方法, 
JSON、JSONP的區別: 
 1、JSON返回的是一串資料、JSONP返回的是指令碼程式碼(包含一個函式呼叫) 
 2、JSONP 只支援get請求、不支援post請求 
 (類似往頁面新增一個script標籤,通過src屬性去觸發對指定地址的請求,故只能是Get請求)

參考連結:
https://blog.csdn.net/echizao1839/article/details/80815155
https://blog.csdn.net/tjcjava/article/details/76468225
https://blog.csdn.net/qq_15037231/article/details/80364647