js原生態跨域請求與ajax中jsonp跨域請求
阿新 • • 發佈:2019-01-11
在web開發中我們經常會說起指令碼的跨域訪問的問題,會出現跨域訪問的限制是因為javascript語言安全限制中的同源策略(same-origin policy )所造成的。
同源策略簡單的說就是一段指令碼只能讀取來自於同一來源的資源,這裡的同一來源指的是主機名、協議和埠號的組合;舉個例子具體說明
我們的主機地址http://localhost:8080/test/b.html的js指令碼訪問下列url的結果和原因
URL 結果 原因
http://localhost:8080/tset/d.html 成功
https://localhost:8080/tset/c.html 失敗 協議不同
http://localhost:8080/tset/c.html
http://www.sina.com.cn/a/b.html 失敗 主機名不同
所有隻有當訪問的url中,協議,主機名,埠號一致是才被視為同一來源,其他情況則一般為跨域請求。
出現了跨域請求我們已經如何解決呢?
首先說ajax中的jsonp實現跨域請求,在學習jsonp跨域請求前建議看一下jsonp的實現原理,http://kb.cnblogs.com/page/139725/頁面程式碼
$.ajax({
type: "GET" , //jsonp跨域請求只能是get請求
async: true, //jsonp跨域請求只能是非同步請求
contentType:'application/x-javascript;charset=utf-8',
url: 'http://localhsot:8080/jee/sys2/getth/path',
data:{xpath:xpath,href:href,title:title},
dataType: "jsonp" ,
jsonp:"callback",//用以獲取回撥函式的引數名
jsonpCallback:"jsonpCallback", //定義回撥函式名稱
success: function(data){ //定義了回撥函式名稱ajax自己處理返回的資料,傳回success屬性中
alert(data.tishi);
},error:function(){}
});
後臺程式碼
String callback=request.getParameter("callback"); //通過引數獲取到客戶端的回撥函式
String data=callback+"({\"tishi\":\"儲存成功!\"})"; //拼成回撥函式加json的格式
response.setHeader("Content-type", "application/x-javascript;charset=utf-8");
response.getWriter().write(data);
由於瀏覽器核心等限制,有事並不支援ajax的請求,所以不能使用ajax請求時我們可以使用javascript 原生的xmlhttprequest實現跨域的請求
var postpath = "path=123";
var xmlhttp = new XMLHttpRequest();
//xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 這是老版ie使用的建立xhttprequest物件的方法
var URL = "http://localhsot:8080/jee/sys2/getath/path";
xmlhttp.open("POST", URL, true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(postpath);
xmlhttp.onreadystatechange = function() {
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
var b = xmlhttp.responseText;
else {
}
}
在js原聲的跨域請求中,後臺的程式碼中一定要設定response的head中包含(Access-Control-Allow-Origin”, “*”),Access-Control-Allow-Origin的意思為允許訪問的請求來源,後面的*表示允許一切請求訪問
後臺程式碼示例
String path=request.getParameter("path");
response.setHeader("Content-type", "application/x-javascript;charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write(data);
這樣使用xhttprequest的一次跨域的請求就完成了