localStorage,sessionStorage,session和cookies的技术优势和缺点是什么?我何时使用其中一个?
我的案例:带有键+值的localStorage应该在浏览器关闭时删除,而不是单个标签.
请查看我的代码是否正确以及可以改进的内容:
//create localStorage key + value if not exist
if(localStorage){
localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"};
}
//when browser closed - psedocode
$(window).unload(function(){
localStorage.myPageDataArr=undefined;
});
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS),而不留痕迹.有几个解决方案:
第一个可能是最糟糕的解决方案 - 你需要从当前窗口打开一个窗口,然后只要你打开窗户就可以进行通信.如果您在任何窗口中重新加载页面,则很可能会丢失通信.
第二种方法,使用postMessage,可能启用跨源通信,但遇到与第一种方法相同的问题.您需要维护一个窗口对象.
第三种方式,使用cookie,在浏览器中存储一些数据,这可以有效地看起来像向同一域上的所有窗口发送消息,但问题是你永远不知道所有标签是否已经读过"消息"打扫干净.您必须实现某种超时以定期读取cookie.此外,您受限于最大cookie长度,即4KB.
使用localStorage的第四种解决方案似乎克服了cookie的限制,甚至可以使用事件进行监听.接受的答案中描述了如何使用它.
编辑2018:接受的答案仍然有效,但现代浏览器有一个更新的解决方案,使用BroadcastChannel.有关如何使用BroadcastChannel在选项卡之间轻松传输消息的简单示例,请参阅其他答案.
在使用JSP和Servlets在java中实现的Web应用程序中; 如果我在用户会话中存储信息,则从同一浏览器的所有选项卡共享此信息.如何在浏览器选项卡中区分会话?在这个例子中:
<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>
Run Code Online (Sandbox Code Playgroud)
将此代码复制到jsp页面(testpage.jsp
)中,将此文件部署在服务器上的Web应用程序的现有上下文中(我使用Apache Tomcat),然后使用正确的URL(localhost/context1/testpage.jsp
)打开浏览器(FF,IE7或Opera ),键入您在输入中的姓名并提交表格.然后在同一浏览器中打开一个新选项卡,然后您可以在新选项卡上看到您的名称(从会话中获取).小心浏览器缓存,有时似乎不会发生,但它在缓存中,刷新第二个选项卡.
谢谢.
我已经学会了sessionStorage
(在会话期间持续)和localStorage
(如果没有删除则永远存在)之间的区别.
我可以看到它localStorage
可以用作更好的cookie版本.(更大的尺寸,不是像cookie那样为每个HTTP请求前往服务器).
但是,因为sessionStorage
,我在想什么时候才能有效地使用它?
我想到用户输入到pageA中的文本字段,然后在同一个选项卡或浏览器窗口中移动到pageB,pageB可以查找sessionStorage.
我不能真正扩展我的猜测,而不是上面的场景.谁能告诉我sessionStorage怎么用?
我使用ASP.net Identity创建了一个承载令牌.在AngularJS中,我编写了这个函数来获取授权数据.
$scope.GetAuthorizeData = function () {
$http({
method: 'GET',
url: "/api/Values",
headers: { 'authorization': 'bearer <myTokenId>' },
}).success(function (data) {
alert("Authorized :D");
$scope.values = data;
}).error(function () {
alert("Failed :(");
});
};
Run Code Online (Sandbox Code Playgroud)
所以我想将此令牌存储到浏览器cookie中.如果此处存在此令牌,则获取令牌并从IIS服务器获取数据,否则重定向到登录页面以登录以获取新令牌.
同样,如果用户点击退出按钮,它应该从浏览器cookie中删除令牌.
这该怎么做 ?有可能吗?是验证和授权用户的正确方法吗?如果有多个用户令牌怎么办?
在关注Weblinks时,我看到了HTML5 sessionStorage的不同行为.有时第一页的sessionStorage被复制到TargetPage,有时我在TargetPage上得到一个空的sessionStorage.
任何人都可以解释一下,为什么会这样?
鉴于以下链接:
<a href="TargetPage.html" target="_blank">link</a>
Run Code Online (Sandbox Code Playgroud)
当我通过右键单击 - >"在新选项卡中打开链接"打开链接时,TargetS上的sessionStorage为空.(预期) 但是当我用正常的左键单击打开链接时,sessionStorage会被复制到TargetPage.(意外)
注意:我在Chrome和Firefox中看到过这种行为.在这两种情况下,Internet Explorer 9都提供空的sessionStorage.这是我的预期行为.
我创建了一个jsFiddle来演示这种行为:http://jsfiddle.net/P9nUv/3/
任何人都可以想到一个跨浏览器的解决方案,以确保新浏览器选项卡/ Windows的空sessionStorage,无论它们如何被打开?
任何帮助表示赞赏!
我想在浏览器标签之间共享我的身份验证令牌,建议使用HTML5localStorage
.但是,当浏览器关闭时,我不希望任何与身份验证相关的内容留在我的存储中,建议使用HTML5sessionStorage
.
这意味着您无法在选项卡之间共享,为此您应该使用localStorage
因此,建议不要将任何敏感信息存储在本地存储中
如何在选项卡之间组合我的身份验证令牌,并确保在浏览器关闭时没有任何内容留在存储中?
其他网站如何解决这个看似简单的问题.
authentication html5 authorization session-storage local-storage
我有JAVA Web应用程序,我需要停止在浏览器选项卡之间共享会话,这意味着
用户打开浏览器,登录到他的帐户并在同一浏览器的新选项卡中打开特定页面.根据默认设置,会话将共享到新选项卡,用户将自动登录到新选项卡.任何人都可以告诉我这是如何停止的,所以我至少可以在几个敏感页面中限制它,如果不是整个应用程序.
https://codesandbox.io/s/material-demo-j5ec5
demo.js
anotherPage = () => {
console.log("redictToStepper --->");
this.props.history.push("/anotherPage");
if (!event) {
console.log("window --->");
event = window.event;
} // ie suq
if (!event.newValue) return; // do nothing if no value to work with
if (event.key == "getSessionStorage") {
console.log("window --->");
// another tab asked for the sessionStorage -> send it
localStorage.setItem("sessionStorage", JSON.stringify(sessionStorage));
// the other tab should now …
Run Code Online (Sandbox Code Playgroud)