1. 程式人生 > >js原生態跨域請求與ajax中jsonp跨域請求

js原生態跨域請求與ajax中jsonp跨域請求

在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的一次跨域的請求就完成了