解決IE下不支持跨域,TypeError:Access deny的問題--Jsonp

  問題描述:

  在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):

  JSONPJSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網頁從別的網域要資料。另一個解決這個問題的新方法是跨來源資源共享

  由於同源策略,一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com 的服務器溝通,而 HTML 的 <script> 元素是一個例外。利用 <script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料並不是 JSON,而是任意的 JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。

  

發佈了88 篇原創文章 · 獲贊 435 · 訪問量 126萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章