我正在创建一个带有角度的Intranet Web应用程序 它有多个不同域的仪表板。
我需要将当前用户重定向到另一个仪表板并发送一个对象。
我尝试过使用localstorage,但它只有一个域的本地存储。
那么,有什么想法吗?
答案 0 :(得分:0)
当然可以使用LocalStorage ......
正如您在问题中提到的那样,您正在制作Intranet webapp,显然您将只有一台服务器在您的网络上托管它。浏览器将允许您的存储进入本地存储,您可以从所有仪表板访问您的值。 (我可以选择多个仪表板,而不是多个用户,每个控制台,每个或多个用户都有多个仪表板。)。所以这些东西不需要跨域......
如果你想传递一些跨域对象,请通过URL传递它的值。你可以在另一边轻松访问它..
对于跨域localstorage共享,
您可能知道,LocalStorage是基于域的。您无法从不同域上的localstorage读取或写入,即使该子域也是如此。但是有一些iframe技巧可以用来将数据从域存储到它的子域。
您通常会创建一个托管在子域上的iframe,该iframe将document.domain设置为父域。然后将PostMessage发送到iframe,在iframe内部设置localStorage的值。
这是代码
主档
<script>
window.onload = function() {
var win = document.getElementsByTagName('iframe')[0].contentWindow;
var obj = {
name: "Jack"
};
win.postMessage(JSON.stringify({key: 'storage', data: obj}), "*");
};
</script>
<iframe style="display:none" src="http://sub.domain.com/iframe.html"></iframe>
如果要从LocalStorage保存和加载值,可以使用方法键PostMessage来指示需要采取的操作。您还可以从iframe向其父级发回消息,并从localStorage读取数据。
<强> IFRAME 强>
document.domain = "domain.com";
window.onmessage = function(e) {
if (e.origin !== "http://domain.com") {
return;
}
var payload = JSON.parse(e.data);
switch(payload.method) {
case 'set':
localStorage.setItem(payload.key, JSON.stringify(payload.data));
break;
case 'get':
var parent = window.parent;
var data = localStorage.getItem(payload.key);
parent.postMessage(data, "*");
break;
case 'remove':
localStorage.removeItem(payload.key);
break;
}
};
以及域名主页
window.onload = function() {
var win = document.getElementsByTagName('iframe')[0].contentWindow;
var obj = {
name: "Jack"
};
// save obj in subdomain localStorage
win.postMessage(JSON.stringify({key: 'storage', method: "set", data: obj}), "*");
// load previously saved data
win.postMessage(JSON.stringify({key: 'storage', method: "get"}), "*");
window.onmessage = function(e) {
if (e.origin != "http://sub.domain.com") {
return;
}
// this will log "Jack"
console.log(JSON.parse(e.data).name);
};
};