2011-08-05 52 views
0

我正在使用OpenFire服務器和JSJaC客戶端庫構建聊天應用程序。 頁面從http://staging.mysite.com加載,XMPP在http://xmpp.mysite.com上運行。正如你所看到的,他們都擁有相同的域名。所以我在頁面加載時使用下面的代碼。XMPP和相同的來源策略問題

function OnPageLoad(){ 
    document.domain = "mysite.com"; 
    DoLogin(); 
} 

無論如何,它拋出我的例外,說我違反了安全。爲什麼document.domain不起作用?它應該起作用還是僅僅爲了「美」而完成?如果是的話,在這種特定情況下可以做些什麼?

我沒有訪問庫內的XMLHttpRequest對象,也不控制它。

回答

0

無論如何。我不得不深入一點JSJaC庫,並對代碼進行一些注入。但首先我已經做了一些解決方法。基本上我在響應中添加了以下標頭

Access-Control-Allow-Methods: GET, POST, OPTIONS 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Content-Type, * 

通常,這可以使用本地xhr進行跨域請求。然而,它證明只能在現代瀏覽器中工作。例如,它在IE8中不起作用,任何版本的Opera都會拒絕這個標題。 然後我使用基於閃存的解決方案。我使用了flXHR並修改了jsjac.uncompressed.js。

XmlHttp.create = function() { 
    // try { 
    // if (window.XMLHttpRequest) { 
    //  var req = new XMLHttpRequest(); 
    //  
    //  // some versions of Moz do not support the readyState property 
    //  // and the onreadystate event so we patch it! 
    //  if (req.readyState == null) { 
    // req.readyState = 1; 
    // req.addEventListener("load", function() { 
    //     req.readyState = 4; 
    //     if (typeof req.onreadystatechange == "function") 
    //    req.onreadystatechange(); 
    //    }, false); 
    //  } 
    //  
    //  return req; 
    // } 
    // if (window.ActiveXObject) { 
    //  return new ActiveXObject(XmlHttp.getPrefix() + ".XmlHttp"); 
    // } 
    // } 
    // catch (ex) {} 
    // // fell through 
    // throw new Error("Your browser does not support XmlHttp objects"); 
    var AsyncClient = new flensed.flXHR({ 
     "autoUpdatePlayer": true, 
     "instanceId": "myproxy" + _xhrpf.toString(), 
     // This is important because the library uses the response xml of the object to manipulate the data 
     "xmlResponseText": true, 
     "onreadystatechange": function() { } 
    }); 
    // counter for giving a unique id for the flash xhr object. 
    _xhrpf++; 
    return AsyncClient; 
}; 


var _xhrpf = 1; 

然後,我只是在目標域的根目錄中添加了一個crossdomain.xml。現在,如果瀏覽器帶有Flash插件,它可以很好地工作。
此外,我想做一些檢測機制,如果沒有Flash插件,只需要一個本地xhr,並希望瀏覽器支持跨域請求頭。

+0

是的,順便說一句,'document.domain'只是爲了一個美麗! – Oybek