XMPP и та же проблема политики происхождения - PullRequest
0 голосов
/ 05 августа 2011

Я создаю чат-приложение, используя сервер OpenFire и клиентскую библиотеку JSJaC.Страница загружается с http://staging.mysite.com, а XMPP запускается на http://xmpp.mysite.com. Как вы можете видеть, они оба используют один и тот же домен.Поэтому я использую следующий код при загрузке страницы.

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

В любом случае это вызывает у меня исключение, говоря, что я нарушаю безопасность.Почему document.domain не работает?Должно ли это работать или это сделано только для «красоты»?Если да, что можно сделать в этой конкретной ситуации?

У меня нет доступа к объекту XMLHttpRequest внутри библиотеки, и я не контролирую его.

1 Ответ

0 голосов
/ 07 сентября 2011

В любом случае. Мне пришлось немного углубиться в библиотеку 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 просто отклоняла этот заголовок. Тогда я использовал решение на основе flash. Я использовал 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.
Далее я хочу создать какой-нибудь механизм обнаружения, если нет плагина для флеш-памяти, просто сделайте нативный xhr и надейтесь, что браузер поддерживает заголовки для междоменных запросов.

...