我在ASP.NET MVC应用程序的Layout-Page中有以下JavaScript代码,用于将用户的浏览器范围内的Id存储为cookie,因此我可以在服务器端的会话中为相应的用户访问信息。 / p>
if (sessionStorage.getItem("TestWindowId") == null) {
sessionStorage.setItem("TestWindowId", "@Guid.NewGuid().ToString("N")");
$.removeCookie("Test_Cookie");
storeWindowIdInBrowserWideCookie();
window.location=document.URL;
}
if ($.cookie("Test_Cookie") !== sessionStorage.getItem("TestWindowId")) {
$.removeCookie("Test_Cookie");
storeWindowIdInBrowserWideCookie();
window.location=document.URL;
}
function storeWindowIdInBrowserWideCookie() {
var cookieValue = sessionStorage.getItem("TestWindowId");
if (cookieValue != null) {
$.cookie("Test_Cookie", cookieValue);
}
}
在大多数情况下,这都有效。
但在某些用户的随机情况下,sessionStorage.getItem("TestWindowId")
在同一浏览器选项卡上返回null,之前已经设置了它。在这些情况下,我丢失了Id,尽管在服务器端连接到用户信息。根据我的日志,sessionStorage项目已设置,并且在同一秒内的回调调用中,同一浏览器选项卡的sessionStorage再次为null。
什么可能导致客户端的sessionStorage丢失项目?
或者我的逻辑中是否有错误?
更新
我的思维模式存在问题。问题不在于sessionStorage项目已被删除,而是将错误的cookie值与请求一起发送到服务器。 由于问题不同,我开了另一张票: Store browser window specific id in cookie
答案 0 :(得分:1)
根据文档。
sessionStorage类似于Window.localStorage,唯一的区别是当存储在localStorage中的数据没有到期设置时,存储在 sessionStorage中的数据会在页面会话结束时被清除。页面会话持续为只要浏览器处于打开状态并在页面重新加载和恢复后幸存下来。 在新标签页或关闭窗口中打开页面会导致会话存储过期。
因此,客户端可能会关闭浏览器或在新选项卡中打开它。