2011-08-05 13 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ライブラリを少し深く掘り下げてコードに注入しなければなりませんでした。しかし、まず私はいくつかの回避策を実行しました。基本的に私は、一般的に、これはネイティブXHRを使ってクロスドメイン要求を行うことができる応答

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

に以下のヘッダを追加しました。しかし、現代のブラウザだけで動作することが判明しました。例えば、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を追加しました。ブラウザがフラッシュプラグインを持っている場合、これは完全に動作します。
さらに、フラッシュプラグインがない場合はネイティブxhrを作成し、ブラウザがクロスドメイン要求のヘッダーをサポートしていることを期待しています。

+0

ところで、 'document.domain'はちょうど美しさです! – Oybek

関連する問題