天天看點

處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)

一個域名位址的組成:

處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)

當協定、子域名、主域名、端口号中任意一個不相同時,都算作不同域。

不同域之間互相請求資源,就算作“跨域”。

比如:http://www.abc.com/index.html請求http://www.efg.com/service.php

JavaScript出于安全方面的考慮,不允許跨域調用其他頁面的對象。

什麼是跨域呢,簡單地了解就是因為JavaScript同源政策的限制,a.com域名下的js無法操作b.com或者是c.a.com域名下的對象。

ww.abc.com/index.html調用www.abc.com/service.php(非跨域)

ww.abc.com/index.html調用www.efg.com/service.php(跨域) 主域名不同

ww.abc.com/index.html調用bbs.abc.com/service.php(跨域)   子域名不同

ww.abc.com/index.html調用www.abc.com:81/service.php(跨域)   端口号不同

ww.abc.com/index.html調用https://www.abc.com/service.php(跨域)   不寫預設是http協定,協定不同,是以跨域。

子域名:

下面都是abc.com的子域名,可以有一級,也可以有多級,子域名不同就跨域了。

www.abc.com

bbs.abc.com

beijing.bbs.abc.com

haidian.beijing.bbs.abc.com

主要是後端做一個代理,跟前端沒關系。

通過在同域名的web伺服器端建立一個代理:

北京伺服器(域名:www.beijing.com)

上海伺服器(域名:www.shanghai.com)

比如在北京的web伺服器的背景

(www.beijing.com/proxy-shanghaiservice.php)來調用上海伺服器(www.shanghai.com/service.php)的服務,然後把響應結果傳回給前端,這樣前端調用北京同域名的服務就和調用上海的服務效果相同了。

JSONP解決主流浏覽器get請求的跨域資料通路問題。

在A域名去聲明一個方法,

載入B域名中的js,因為script可以跨域送出http請求。

B域名中載入的js中直接去調用a域名中聲明的方法。

借助script标簽,A域名去聲明,B域名去調用。

其實這種處理方式和XHR沒有太大關系了,隻是借助script标簽可以跨域通路的特性。

前端改造:

在get請求的代碼中需要修改一下dataType,從json改為jsonp。再增加一個屬性,這個名字就叫jsonp,值可以任意寫,比如叫callback。

也就是對代碼做了2處改動,

把dataType從json改成jsonp,

增加一jspnp的屬性取了個值叫callback。

處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)

後端改造:

在get請求的進行中擷取到callback, 前端jsonp參數取了個名字叫callback,是以後端就要擷取callback。

如果前端取callback123的話,後端就要擷取callback123。

處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)
處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)

發請求的時候jquery自動增加了一個參數,參數的名稱是callback123,參數的值是jquery自動生成的。

處理跨域方式一、跨域一、處理跨域方式—代理二、處理跨域方式—JSONP三、處理跨域方式—XHR2(HTML5)

比如我實際應用中一例子:

發完ajax請求,網頁中請求的Headers的Request URL為:http://api.xxx.com/vipuser/grade?cb=jQuery18308066630555287624_1487902991956&username=xxx&token=xxx&format=jsonp

參數名cb,參數的值是jquery自動生成的。

這個值是:jQuery18308066630555287624_1487902991956

響應Response為:

傳回值:jQuery18308066630555287624_1487902991956({"message":"success","gradeInfo":{xxx},"code":"0","info":{xxx}})

傳回值前面是參數的值,一模一樣,後面用括号括起了要傳回的json對象。

最後注意一點:JSONP的原理隻能對get請求有效,不支援POST請求。

html5提供的XMLHttpRequest Level2已經實作了跨域通路以及其他的一些新功能。

IE10以下不支援XHR2這個标準。

使用

用戶端不需要什麼改造。

伺服器:隻需要設定2個伺服器頭。

header('Access-Control-Allow-Origin:*');後面有個*星号,*就是所有域都可以通路,當然也可以設定特點的域名。比如說我們伺服器在上海,可以在Access-Control-Allow-Origin後面設定一個北京伺服器的域名,隻有在北京的那個域名可以通路。

header('Access-Control-Allow-Methods:POST,Get');

本文轉自帥氣的頭頭部落格51CTO部落格,原文連結http://blog.51cto.com/12902932/1926154如需轉載請自行聯系原作者

sshpp

下一篇: location總結

繼續閱讀