問題描述:
在IE瀏覽器下,不支持跨域的,從一個網站ajax到另一個網站請求數據,異步方式加載數據,如從http://online.hfut.edu.cn/發送ajax請求到http://xipang.hfutonline.net/public/rank/num/10請求數據,請求活躍用戶數據,如果datatype=json則在IE下不能請求成功,會出現TypeError:Access deny的問題,到網上找了資料發現是IE不支持跨域,要用jsonp來解決。
解決辦法如下:
js方面則將datatype從json改成jsonp格式,php或者java後臺則在返回的json數據中加一段ajax發過來的jsoncallback即可,具體代碼如下:
jquery代碼如下:
$.ajax({
type:"get",
url:"http://xipang.hfutonline.net/public/rank/num/10",
dataType:"jsonp",
jsonp:'jsonpcallback',
success:function(data){
html = '';
for(i=0; i< data.length; i++) {
html += '<li class="user"><a href="http://xipang.hfutonline.net/user/index/uid/'
+data[i].uid+'" target="_blank"><img src="/ucenter/avatar.php?uid='+data[i].uid+'&size=small" width="67px" height="67px" alt="'+data[i].username+'"></a></li>';
}
$("#activity_user").empty().append(html);
}
})
後臺代碼如下:
php代碼:
$callback = $_GET['jsonpcallback'];
$str = "[{""id"":""1"",""name"":""測試1""},{""id"":""2"",""name"":""測試2""}]";//json數據
echo $callback."(".$str.")";//返回的數據
java代碼:
jsonp = request.getParameter("jsonpcallback");
str = "[{""id"":""1"",""name"":""測試1""},{""id"":""2"",""name"":""測試2""}]";
str = jsonp + "(" +str+")";
response.Write(str);
這樣問題就解決了,關於IE的跨域問題。。。
補充(jsonp):
關於jsonp的解釋如下(詳見維基百科http://zh.wikipedia.org/zh-cn/JSONP):
JSONP(JSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網頁從別的網域要資料。另一個解決這個問題的新方法是跨來源資源共享。
由於同源策略,一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com
的服務器溝通,而 HTML 的 <script>
元素是一個例外。利用 <script>
元素的這個開放策略,網頁可以得到從其他來源動態產生的
JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料並不是 JSON,而是任意的 JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。