關於跨域和JSONP的一些理解
面試的時候,遇到一些比較多問JSONP的,給新手黨做一些總結吧,有不對的地方,歡迎大神的指正。
使用背景:
瀏覽器有同源策略,同源策略是一種約定,是瀏覽器基本的安全功能,同源就是指協議和域名和埠三者相同。
同源策略會限制cookie,localStorage等儲存效能和DOM節點,以及攔截ajax的響應等等
需要在不同協議或者不同域名或者不同埠下進行訪問的時候就是跨域。
例如:http://www.baidu.com:8000/這個地址,前面的HTTP就是協議,www.baidu.com時候域名,8000是埠號。
JSONP的原理
同源策略下有幾個標籤不受限制,分別是
<img src="" alt="" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript" src=""></script>
JSONP的跨域就是利用了script標籤不受限制的原理
JSONP的優缺點
優點:相容性好,簡單易用,能用來解決主流瀏覽器的跨域訪問問題
缺地:只支援get方法,不能使用post方法,有一定的侷限性
JSONP的使用
給大家貼一個在別的部落格上面看到的JSONP的使用程式碼(連結在後面)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP</title>
</head>
<body>
<input type="text" id="song" name="">
<input type="button" id="song_search" value="歌曲搜尋" name="">
<br />
<div style="width:200px;height:230px;background:pink" id="song_list"></div>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
var searchJsonCallback=function(data){
//遍歷查詢結果
var alb_html='';
for(var i in data.list){
alb_html+='<span>專輯:</span><div style="color:black">'+data.list[0].albumname+'</div>';
}
$("#song_list").html(alb_html);
};
$("#song_search").on("click",function(){
var keyword=$("#song").val();
if(keyword==undefined||keyword==""){
alert("歌曲搜尋不能為空");
return false;
}else{
var url = "http://cgi.music.soso.com/fcgi-bin/fcg_search_xmldata.q?source=10&w="+keyword+"&perpage=1&ie=utf-8";
// 建立script標籤,設定其屬性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script標籤加入head,此時呼叫開始
document.getElementsByTagName('head')[0].appendChild(script);
}
});
</script>
</body>
</html>
點選按鈕觸發後會動態建立一個script標籤,然後把跨域的地址賦值給這個標籤的src屬性,還要在地址中向伺服器傳遞迴調函式的函式名稱,這個名稱不可以自己隨意定義,是和服務端用於包裹返回資料的名稱是一致的,建立好了以後會觸發這個回撥函式,回撥中的形參就是返回的資料,這樣就完成了跨域獲取資料
文中程式碼的文章連結:https://segmentfault.com/a/1190000009577990?utm_source=tag-newest#articleHeader5
相關文章
- 關於跨域的深入理解跨域
- ajax jsonp跨域JSON跨域
- jsonp跨域封裝JSON跨域封裝
- JavaScript跨域呼叫、JSONPJavaScript跨域JSON
- 關於跨域跨域
- 解決跨域的兩種方案JSONP和CORS跨域JSONCORS
- 深入跨域問題(3) – 利用 JSONP 解決跨域跨域JSON
- 深入跨域問題(3) - 利用 JSONP 解決跨域跨域JSON
- 關於跨域的問題跨域
- jsonp跨域資源引起CORBJSON跨域ORB
- php 支援jsonp跨域請求PHPJSON跨域
- JSONP 跨域原理及實現JSON跨域
- 關於跨域問題跨域
- 關於JavaScript跨域的若干想法JavaScript跨域
- 關於Cookie跨域的問題Cookie跨域
- JSONP原理及實現跨域方式JSON跨域
- 簡單的實現jsonp跨域請求JSON跨域
- 關於django跨域問題Django跨域
- 關於跨域你需要知道的跨域
- 關於go的跨域處理 ginGo跨域
- 關於position的一些理解
- jquery 之 jsonp 與 laravel 實現跨域jQueryJSONLaravel跨域
- JSONP解決跨域請求問題JSON跨域
- 跨域請求之jQuery的ajax jsonp的使用解惑跨域jQueryJSON
- 關於position定位的一些理解
- 【跨域】jsonp看完這篇文章就夠了跨域JSON
- 【JavaScript】通過封裝自己的JSONP解決瀏覽器的跨域問題(Ajax跨域)JavaScript封裝JSON瀏覽器跨域
- 關於跨平臺的一些認識
- 跨域及相關攻擊&防禦總結(JSONP、CORS、CSRF、XSS)跨域JSONCORS
- 關於Flutter空安全的一些使用經驗和理解Flutter
- OpenLayers3關於Map Export的Canvas跨域S3ExportCanvas跨域
- 關於遊標的一些理解
- 搞定所有的跨域請求問題: jsonp & CORS跨域JSONCORS
- 關於Dart中Future的一些理解Dart
- 關於Swift中Properties的一些理解Swift
- 關於Base64的一些理解
- 跨域問題(普通跨域和springsecurity跨域)跨域SpringGse
- 深入跨域問題(4) – 利用代理解決跨域跨域