這很奇怪,我想知道是否有人可以闡明爲什麼會發生這種情況。當在本地主機上運行時JSONP回調不會執行
基本上,我一直拉着我的頭髮出來試圖測試JSONP出來,所以我可以實現JSON Web服務,其他網站可以使用。我正在開發本地主機 - 特別是Visual Studio 2008和Visual Studio 2008內置的Web服務器。
所以,作爲一個JSONP試運行瓦特/ jQuery的,我實現了以下內容:
$().ready(function() {
debugger;
try {
$.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
alert(data.abc);
});
} catch (err) {
alert(err);
}
});
並在服務器上..
<%= Request["callback"] %>({abc : 'def'})
那麼最終發生的是我設置一個斷點上服務器和我在第一個「調試器」上得到斷點;在客戶端腳本中以及在服務器上進行統計。 JSONP URL確實在頁面加載後被調用。這很好。
我遇到的問題是回調永遠不會執行。我在IE8和Firefox 3.5中測試了這個。兩者都不會調用回調。 catch(err)也從來沒有達到過。什麼都沒發生!
我一直停留在這一個星期,甚至在指定的端口上,以Telnet手動密鑰的HTTP請求,以確保服務器返回的格式測試...
callbackfn({abc : 'def'})
..它是。
然後,我明白了,如果我從本地主機更改主機名與一個全球化者本地主機(「」),即http://localhost.:41559/代替http://localhost:41559/(是的,增加一個點到任何主機名是合法的,這是DNS什麼global::
是C#命名空間)。然後它工作!當我剛添加一個點時,Internet Explorer和Firefox 3.5終於向我顯示了一條警告消息。
所以這讓我想知道這是怎麼回事?爲什麼後期腳本標記生成可以使用Internet主機名而不是使用純本地主機?或者這是正確的問題?
顯然這是出於安全原因而實施的,但他們試圖保證什麼?而且,通過使用點來工作,我是否在此安全功能中暴露了安全漏洞?
順便說一句,我的主機文件,雖然改變了其他主機,沒有什麼特別與本地主機進行;默認的127.0.0.1/:: 1仍然存在,下面沒有覆蓋。
追問:我過去,這爲當地發展的目的,加入:
127.0.0.1 local.mysite.com
..我的hosts文件,然後將以下代碼添加到我的Global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Headers["Host"].Split(':')[0] == "localhost")
{
Response.Redirect(
Request.Url.Scheme
+ "://"
+ "local.mysite.com"
+ ":" + Request.Url.Port.ToString()
+ Request.Url.PathAndQuery
, true);
}
}
我建議使用像firebug這樣的工具,看看是否爲JSONP的東西完成了「腳本」請求,並且實際上看到了什麼數據會回來。 – 2009-08-02 01:32:56