基於JQUERY的AJAX跨域問題完美解決方案



(請求的跨域服務器不支持常規」?」查詢請求時的解決方案)javascript


昨天第一次作VIP需求時,發現一個超奇怪的問題,我有如下URL地址:php

 

http://dynamic.vip.xxxxxx.com/active/<controllers>/<active>/<id>html

 

放在瀏覽器地址欄中訪問能夠獲得正確的輸出,但我一放到 AJAX 中去異步請求後用 FireBug 調試時確怎麼都不出結果,和水龍兄一塊兒調試了好久都沒有發現是什麼問題,因爲這個URL對方的程序是用XX框架寫的,我是第一次使用這個XX框架進行開發,對它不是很熟(有時間要研究一下它的內核源碼),總覺得是它什麼地方有設置影響了的;就在我快要吐血時,樂鋒(對這塊比較瞭解的哥們)終於上線了,我把問題向他說下後,他第一反應就是:」你是否是跨域訪問了。。」前端

OH FUCK,我和水龍一直研究程序邏輯,居然忽視了本身的當前域名,由於我當前執行請求的域名是:java

 

http://vip.xxxxxx.com/active1/index.htmlpython

 

問了一下樂鋒,現系統中已提供的幾個方案(函數)都不太使人滿意或太煩瑣了,和樂鋒討論了幾種方案後,一時沒有找到最好解決方案,一看時間,22:00了,天色已晚,不打擾他晚上陪老婆了!回到家裏本想經過利用 iframe 來加載跨域的 url 來獲得 dom 數據,研究後發現的想法太天真了,JS的安全策略跟本不容許我這樣作;想經過 proxy 代理的方案,但想了一下,那比如今系統中所使用的方案更麻煩,詳細研究了一下jQuery最新版關於跨域的解決方案後,終於讓我研究出了一種很是方便的解決方案:jquery

以下是代碼示例:編程

—————— http://a.com/index.html ——————-json


<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
/*
AJAX跨域問題完美解決方案
研究:袁維
啓示:樂鋒
*/
function jsonCallBack(url,callback)
{
$.getScript(url,function(){
callback(json);
});
}
function fun1()
{
jsonCallBack('http://b.com/b.php',function(json){
alert(json.message);
})
}
</ script>
<button type="button" onclick="fun1()">跨域訪問</button>
跨域

—————— http://b.com/b.php ——————-


<?php
$ary 
= array('result'=>0,'message'=>'跨域成功');
$json json_encode($ary);
//必定要這樣定義輸出最後的JSON數據,這是利用JS的閉包特性
echo "var json=$json;";
?>

該方案注意事項:

1:jQuery的版本必需大於 1.2版,不然不支持跨域處理

2:只支持 GET 方式的請求

2:請求的 URL 必需按以下例子中那樣返回數據.

該方案注意利弊:

優勢:

1:比用 iframe 加輸出 parent.XXX() 的方案簡單高效明瞭,前端處理更方便

2:至關 proxy 方式在編程上也簡單多了

缺點:

1:必需使用jQuery,

2:返回的數據格式必需按示例樣,固然不限於JSON,但它是處理最方便的.

(跨域服務器支持常規」?」查詢請求的解決方案,利用JQuery的JSONP)

——————— http://b.com/index ———————-


<script src="jquery-1.4.2.js" type="text/javascript"></script>
<script type="text/javascript">
function fun1()
{
$.getJSON("http://a.com/c.php?no=10&msg=ok&format=json&jsoncallback=?",
function(data){
alert(data.msg);
});
}
</script>
<button type="button" onclick="fun1()">跨域處理</button>


——————– http://a.com/c.php ———————-


<?php
$no 
$_GET['no'];
$msg $_GET['msg'];
$json json_encode(array('no'=>$no,'msg'=>$msg));
//必需如下這樣輸出
echo $_GET['jsoncallback'].'('.$json.')';

相關文章
相關標籤/搜索