2013-05-06 46 views
0

中的數據我花了整個週五的時間,並且認爲我會在星期一進來看看我能否得到一些幫助。這裏有一個總結:JSONP沒有返回https

我有兩個網站,一個使用AJAX調用另一個網站上的http處理程序以獲取令牌(字符串)。我最初使用了一個很好的json調用,但是當我訪問的站點使用https時,數據不會被返回。

我收到200條成功消息,並且使用http獲取數據,但不使用https。我在我的本地機器上運行此問題。我驗證如果我使用相同的URL,則數據會在我的瀏覽器中返回。

另外,在https模式下,我設置了一個斷點,它看起來好像甚至沒有調用代碼來傳回令牌。

在此先感謝!

  function onSuccessGetToken(token, url, type) { 
     var getTokenUrl = url + "SSOtoken=" + token; 

     //verify the URL is correct, for testing 
     alert(getTokenUrl); 

     $.ajax({ 
      url: getTokenUrl, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       onSuccess(JSON.stringify(msg).replace(/\"/g, ""), url, type); 
      }, 
      error: function (msg) { 
       //using jsonp, this always goes here, but no data is returned 
       alert(JSON.stringify(msg)); 
       onErrorGetToken(msg); 
      } 
     }); 
    } 
+0

JSONP和JSON是兩個完全不同的東西。你的問題標題是關於JSONP的,但我確定你真的在談論JSON。 – 2013-05-06 11:55:26

回答

1

您還沒有表現出什麼getTokenUrl含有,但是從你的問題描述我說你正在運行到Same Origin Policy,防止不同之間的Ajax調用「的起源。」注意「出身」並不意味着「域」,不同的領域是不同的起源,而且還有不同的協議(httphttps),不同的端口(808080例如)等

在你的問題,你談論JSONP,但你沒有使用JSONP。你可以使用JSONP來處理跨源請求,這就是它的用途。爲此,請使用"jsonp"作爲您的dataType,並確保您的服務器返回正確的JSONP響應(包括從查詢字符串中獲取JSONP回調的名稱)。有關JSONP的更多信息,請參見the Wikipedia article on it

當您同時控制兩個來源時執行跨來源呼叫的另一種策略是使用Cross-Origin Resource Sharing。這是您的服務器響應瀏覽器發送的「預檢」請求的地方,它告訴瀏覽器服務器是否接受來自文檔原點的調用。因爲它在IE以外的這些日子裏都很不錯。在IE9和更早版本中,它不受標準的XMLHttpRequest對象(這是jQuery使用的)支持。截至IE10,他們終於明白了。


無關:您的通話ajax,你指定contentType: "application/json"。這是告訴服務器,你是發送是JSON,而不是告訴jQuery將響應視爲JSON。這也是另一個,dataType,你也指定(雖然有一個正確配置的服務器,你不應該得到  —服務器應該返回Content-Type標題與正確的MIME類型)。

+0

getTokenUrl可以正常工作,我會做一個提醒並且可以驗證它是以http還是https模式工作。你對有關同源策略的評論,我認爲它與域名有關,但你可能對端口是正確的,我會嘗試在https模式下運行我的站點,看看是否有幫助。謝謝您的回覆。 – dave2118 2013-05-06 12:02:26

+0

我只是在這兩個網站上使用https,它的工作原理。簡直不能相信我整個星期五浪費了一些東西。感謝您的幫助! – dave2118 2013-05-06 12:14:10

+0

@ dave2118:不客氣!很高興這有幫助。是的,有些瀏覽器對於SOP報告非常微妙。FWIW,如果您使用的是Chrome瀏覽器並查看了開發人員工具,則它有一個相當明確的錯誤消息(現在,它並不總是)。我不知道其他瀏覽器... – 2013-05-06 12:28:10