在退出时删除了SessionStorage浏览器范围(范围)或LocalStorage

时间:2015-12-08 10:00:49

标签: javascript html5 local-storage session-storage

是否有任何机制可以让我在浏览器级别处理这些值?我的意思是:

  • sessionStorage我可以在浏览器的任何选项卡中访问值(类似于服务器端会话)

  • 将在会话结束时删除的localStorage(关闭浏览器时,而不是标签页)

例如,视频在播放器的一个标签中启动。某些标志存储在那种存储器中。当用户打开具有相同URL的另一个选项卡时,应用应该读取该标志并拒绝播放视频。当然应该在退出时将其删除,否则flag将拒绝该浏览器中的所有未来请求。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

每个标签或窗口数据都可以保存/读取到本地/会话存储,但它仅限于该域。

你问过关于两个标签上的视频处理的问题,它可以被拉出来,但处理起来非常棘手,我不建议走那条路!您可以定期将视频的时间戳保存到浏览器存储,但这也取决于将视频发送到浏览器的服务器,并且您最终可能根本不向用户提供视频!

为了在浏览器窗口关闭时清除数据,我认为没有任何事件,但是有窗口失去焦点的事件,所以你可以使用我想的。

答案 1 :(得分:1)

如果要求最后“只要浏览器窗口打开”,那么由于浏览器不再在该级别上工作,您将遇到重复的问题 - 有标签级别和域名 - 级别(像cookie一样持续存在)。 “浏览器窗口”只是一组选项卡,除非您以特定方式专门设置浏览器(在关闭时删除cookie和会话数据,而不是在窗口实例之间共享数据)。然而,这是浏览器设置(在不同的浏览器中甚至不是标准的),而不是你可以控制客户端的东西。

如果您愿意考虑一些替代方案,以提供您似乎需要的最终结果,如果不是按照您指定的具体方式,请继续阅读:

要扩展AkshayJ的原始注释,请使用localStorage,因为sessionStorage只是特定于选项卡的(无法共享)。

为了清除标志,作为设置标志的相同功能的一部分,将onunload事件添加到播放视频的选项卡中,该选项卡将在关闭选项卡或窗口位置远离视频时清除它。这将允许比您最初请求的功能更多的功能,因为在原始情况下,用户必须完全关闭浏览器才能再次播放视频,即使正在播放视频的选项卡早已消失或已移至另一页。

更新

如果围绕这一点的安全/授权至关重要(而不仅仅是想“意外”阻止它发生),那么使用localStorage是完全错误的方法 - 这些数据及其存在最终由用户控制。他们可以删除它,或者设置他们的浏览器,以便窗口实例不共享数据,所以他们需要做的就是打开一个新窗口,同时查看你的视频两次。一个坚定的用户会在几分钟内找到解决方法。

如果你想完全控制它,你必须采用这个域而不是依赖浏览器存储,并使用其他标签,如当前访问的IP列表,或其他一些识别唯一用户的方法,确定是否可以播放视频。请记住,关于何时清除标志是否是域侧的浏览器端,您将遇到与之前相同的问题。

更新

重新:使用什么事件,似乎所有常见浏览器都支持 onunload onbeforeunload (参考:Here和{{3 }})。 Here建议使用两者以保证安全。

更新

OP已经表示担心卸载事件不可靠,如果出现问题,用户可能会永远被锁定。我个人在这里没有遇到任何不可靠性,但如果你担心,那么就引入一个超时方面。让播放视频的标签更新标志(无论它存储在何处),时间戳每30秒/ 1分钟/无论如何。然后,当加载页面的新实例时,请检查时间戳。如果现有页面发生了某些事情,使其冻结并卸载未运行的事件,则时间戳将过时,因为它也将停止更新,因此您只需要检查时间戳是否已过期检查存在。

答案 2 :(得分:1)

$(window).on('beforeunload', function DecideAction() {
   if (('localStorage' in window) && window['localStorage'] !== null) {
      //get value from localstorage using getItem and allow/deny the further access
   }
});

答案 3 :(得分:0)

最后,我放弃了服务器端会话,因为它引发了其他问题,并通过此工作流程解决了这个问题:

  • 页面加载后,如果之前没有设置localStorage值,则会在此选项卡中标记播放器已打开。如果已设置localStorage,则将flag设置为false。

  • 如果设置了标志,则播放视频,否则禁止。

  • 在页面卸载时,仅当设置了标志时(即,如果用户在此选项卡中打开了视频),请删除localStorage值。



$(function () {
    if (localStorage.playerTabOpened) {
        var dateNow = Date.now();
        var diffSinceLastTabOpened = (dateNow - localStorage.playerTabOpened) / 1000;
        // if playerTabOpened value was stored more than 1 day ago, delete it anyway because it could be left by chance
        if (diffSinceLastTabOpened > 86400) {
            localStorage.removeItem("playerTabOpened");
        };
    }
    if (!localStorage.playerTabOpened) {
        shared.playerTabOpenedHere = true;
        localStorage.setItem("playerTabOpened", Date.now());
    } else {
        shared.playerTabOpenedHere = false;
    }
});

$(window).on("beforeunload", function () {
    if (shared.playerTabOpenedHere) {
        localStorage.removeItem("playerTabOpened");
    }
});

if (shared.playerTabOpenedHere) {
    // play
} else {
    // throw error
}