PHP - 每个选项卡的会话数

2022-08-30 23:19:16

是否可以按“浏览器”选项卡进行会话?

例如,用户在浏览器中打开了 2 个选项卡:选项卡 1选项卡 2

选项卡 1 中,他有一个会话:

$_SESSION['xxx'] = 'lorem';

选项卡 2 中,会话为:

$_SESSION['xxx'] = 'ipsum';

现在刷新时,我需要在活动选项卡中获取当前会话。例如,如果用户刷新Tab 2,我需要在加载时获取for选项卡2,即“ipsum”。但不应在选项卡 1 上更改。$_SESSION['xxx']$_SESSION['xxx']

是否有任何选项可以保存每个选项卡的会话。如果不是,还有什么其他选择来处理这个问题?

感谢您的任何帮助!


答案 1

PHP 将会话 ID 存储在 Cookie 中,Cookie 是按客户端(浏览器)而不是选项卡。因此,没有简单易行的方法可以做到这一点。有一些方法可以通过创建自己的会话处理程序来做到这一点,但它们更多的是黑客而不是解决方案,因此有其自身的风险和复杂性。无论出于何种原因,您可能需要它,我非常确定有比会话拆分更好的体系结构解决方案。


答案 2

我一直在网上搜索这个问题的答案,但还没有找到一个令人满意的解决方案。我终于在JavaScript中整理了一些类似的东西。

//generate a random ID, doesn't really matter how    
if(!sessionStorage.tab) {
    var max = 99999999;
    var min = 10000000;
    sessionStorage.tab = Math.floor(Math.random() * (max - min + 1) + min);
}

//set tab_id cookie before leaving page
window.addEventListener('beforeunload', function() {
    document.cookie = 'tab_id=' + sessionStorage.tab;
});

HTML5不在选项卡之间共享,因此我们可以在那里存储唯一的选项卡ID。侦听窗口上的事件告诉我们要离开(并加载其他页面)。通过在离开之前设置 Cookie,我们可以在新请求中包含我们的值,而无需任何额外的 URL 操作。要区分选项卡,您只需要检查服务器并适当地存储会话值即可。sessionStoragebeforeunload$_COOKIE['tab_id']

请注意,Firefox 的行为很奇怪,因为触发将创建一个与其父级共享的窗口,为您提供两个具有相同 ID 的选项卡。手动打开一个空白选项卡,然后导航到目标 URL 将为您提供单独的存储空间。到目前为止,Chrome在我所有的测试中都适用于我。window.open()sessionStorage

我意识到这可能不是正确的答案,甚至不是一个“好”的答案,但这是一个答案。


推荐