首页 文章

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

提问于
浏览
1

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

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

  • localStorage将在会话结束时删除(关闭浏览器时,而不是选项卡)

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

4 回答

  • 1

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

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

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

    心连心,

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

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

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

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

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

    更新:

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

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

    更新:

    re:使用什么事件,似乎所有常见浏览器都支持 onunloadonbeforeunload (参考:HereHere) . This Answer建议同时使用两者以确保安全 .

    更新:

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

  • 1

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

    • 页面加载后,如果之前没有设置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
    }
    

相关问题