我正在使用OpenFire服务器和JSJaC客户端库构建聊天应用程序。 页面从http://staging.mysite.com加载,XMPP在http://xmpp.mysite.com上运行。如您所见,它们共享同一个域。所以我在页面加载时使用以下代码。
function OnPageLoad (){
document.domain = "mysite.com";
DoLogin();
}
无论如何,它引发了我的异常,说我违反了安全措施。为什么document.domain
不起作用?它应该工作还是只是为了“美丽”?如果是,在这种特定情况下可以做些什么?
我无法访问库中的XMLHttpRequest对象,也无法控制它。
答案 0 :(得分: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都拒绝这个标题。 然后我用了基于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插件,它将完美运行。
如果没有flash插件,我想制作一些检测机制,只需制作一个原生的xhr,并希望浏览器支持跨域请求的标题。