Javascript 跨域知識詳細介紹
JS跨域知識總結:
在“跨域”一詞經(jīng)常性地出現(xiàn)以前,我們其實已經(jīng)頻繁地使用它了。如在A網(wǎng)站的img,src指向B網(wǎng)站的某一圖片地址,毫無疑問,這在通常情況下都是能正常顯示的(且不論防盜鏈技術);同樣,可以使script標簽的src屬性指向其它網(wǎng)站的腳本資源(在某些情況下甚至鼓勵這樣做,以便充分利用其它網(wǎng)站的負載優(yōu)勢,減小自身服務器的并發(fā)量)。然而,如若使用js去主動請求其它網(wǎng)站的數(shù)據(jù),比如ajax方式,就會遇到讓人郁悶的跨域問題,這也是我們平常所說的跨域。由于安全原因,跨域訪問是被各大瀏覽器所默認禁止的。這里涉及到同源策略的概念:同源策略阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。
跨域帶來的具體安全問題博主沒有深究,大伙可以自行腦補。
然而,很多情況下,特別是在互聯(lián)網(wǎng)持續(xù)發(fā)展的今天,我們需要請求來自不同合作伙伴或數(shù)據(jù)提供商的前端接口,在跨域訪問的方式?jīng)]有規(guī)范化前(client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5 WebSocket標準支持跨域的數(shù)據(jù)交換,應該也是一個將來可選的跨域數(shù)據(jù)交換的解決方案),有什么方法能繞過它的限制呢?答案有很多(雖然都很麻煩),最常用的當屬所謂的JSONP跨域了。
JSONP原理
JSONP的最基本的原理是:動態(tài)添加一個<script>標簽,而script標簽的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協(xié)議無關了。
JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協(xié)議、端口)的資源。如果要進行跨域請求, 我們可以通過使用html的script標記來進行跨域請求,并在響應中返回要執(zhí)行的script代碼。 這種跨域的通訊方式稱為JSONP。
來個簡單的例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test Jsonp</title>
<script type="text/javascript">
function jsonpCallback(result)
{
alert(result.msg);
}
</script>
<script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script>
</head>
<body>
</body>
</html>
簡述原理與過程:首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器(這里客戶端和服務器約定以key為jsonp的查詢字符串值傳遞)。此時,服務器先生成 json 數(shù)據(jù)。 然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數(shù) jsonp。最后將 json 數(shù)據(jù)直接以入?yún)⒌姆绞?,放置?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端??蛻舳藶g覽器,解析script標簽,并執(zhí)行返回的 javascript 文檔,即執(zhí)行了預定義的callback函數(shù)。
從上述簡述可以推出:除了返回函數(shù)形式的js代碼片段,服務端自然能返回所有符合規(guī)范的可執(zhí)行js片段。
JSONP的缺點是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。(下面還有)
jQuery的Jsonp
如前所述,jsonp并非ajax請求,但是jQuery仍提供與jQuery.ajax一致的方式進行跨域請求:
$.ajax({
url: 'http://crossdomain.com/jsonServerResponse',
type: 'GET',
dataType: 'jsonp',
jsonp: "callback",
jsonpCallback: 'functionName',
success: function (data, textStatus, jqXHR) { }
//……
});
如上所示,dataType設為jsonp表示這是一次跨域請求,jsonp設為服務端預定的傳遞函數(shù)名稱的查詢字符串key,而jsonpCallback即為js函數(shù)名稱;假如jsonpCallback不設置,那么jQuery將自動生成的隨機函數(shù)名(在window對象中加載一個全局的函數(shù),當代碼插入時函數(shù)執(zhí)行,執(zhí)行完畢后就會被移除),可推斷該自動生成的函數(shù)會回調上述代碼中的success函數(shù)。(當手動為jsonpCallback賦值時,不知道success函數(shù)會否回調,還是說jQuery會尋找預定義的函數(shù),若找不到則報錯?博主懶,以后再試吧。)當然jQuery為我們提供了一個簡易版本,$.getJSON,這里就不贅述了。
需要注意的是success函數(shù)中的jqXHR參數(shù),在ajax請求中,它是正宗的jqXHR對象,亦可看作是XMLHTTPRequest對象(繼承or封裝),但是在jsonp請求中卻并非如此,幾乎不能帶給我們如XMLHTTPRequest中最有用的那些信息:它缺少XMLHTTPRequest的請求狀態(tài)信息,所以并不能觸發(fā)絕大部分的回調函數(shù),比如error、complete等(jQuery1.9.0),而可以被回調的success函數(shù)推測應該是由script標記的load事件觸發(fā),這也同ajax依靠XMLHTTPRequest的狀態(tài)的機制完全不同。經(jīng)試驗,脫胎于jQuery的zepto(v1.1.3),在jsonp請求出現(xiàn)錯誤,比如加載js文檔時頭部返回401錯誤時,error函數(shù)會執(zhí)行,但是該函數(shù)的jqXHR參數(shù)也同樣不是正宗的jqXHR類型,甚至不能通過它獲取響應的頭部信息,在這種情況下,我們只是被告知某個環(huán)節(jié)出錯了,卻并不知道具體的錯誤信息。類似響應頭承載有用信息的場景,博主不建議使用jsonp,可以說,使用jsonp的一個前提是:除了網(wǎng)絡異常等非業(yè)務異常外,所有業(yè)務異常(概括地說,乃是從服務器接收請求到返回響應這段時間內拋出的所有異常)都需要以請求結果的形式直接返回給客戶端,便于客戶端回調分析。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Java中常用緩存Cache機制的實現(xiàn)
- JavaScript中訪問id對象 屬性的方式訪問屬性(實例代碼)
- RegExp 隨筆 JavaScript RegExp 對象
- JavaScript實現(xiàn)使用Canvas繪制圖形的基本教程
- Java開發(fā)環(huán)境jdk 1.8安裝配置方法(Win7 64位系統(tǒng)/windows server 2008)
- Javascript將字符串日期格式化為yyyy-mm-dd的方法
- JavaScript登錄驗證碼的實現(xiàn)
- javascript iframe跨域詳解
- Java微信支付-微信紅包
- JavaScript中省略元素對數(shù)組長度的影響
- java從字符串中提取數(shù)字的簡單實例
- Java doGet, doPost方法和文件上傳實例代碼
相關文章
基于JavaScript代碼實現(xiàn)微信掃一掃下載APP
有很多人在做微信的掃一掃下載。但是在微信更新之后微信將該功能給禁止掉了,也不能說是全面禁止吧,因為騰訊、微信是一家嘛,通過應用寶審核的應用好像還是可以通過掃一掃直接下載的,下面通過本篇文章給大家介紹微信掃一掃下載app的代碼片段,感興趣的朋友一起看看吧2015-12-12
Js原型鏈constructor prototype __proto__屬性實例詳解
這篇文章主要介紹了Js原型鏈constructor prototype __proto__屬性實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
JavaScript國際化API格式化數(shù)據(jù)Intl.NumberFormat使用講解
這篇文章主要為大家介紹了JavaScript國際化API格式化數(shù)據(jù)Intl.NumberFormat使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06

