每个浏览器选项卡的不同会话数据

时间:2013-12-10 13:37:24

标签: http session cookies web

通常,HTTP服务器端会话数据存储(例如PHP中的$_SESSION)是使用cookie实现的 - 每个客户端都有一个存储在cookie中的唯一会话ID。服务器接收此cookie并使用它查找会话数据(作为某种键或文件名)。

这样可以正常工作,但有时它会导致问题,因为cookie(以及会话)在浏览器标签之间共享。

我的问题是:是否可以实现服务器端数据存储,为每个浏览器标签保存不同的数据?最好的方法是什么?没有客户端JavaScript。


示例:您有一些具有多个步骤的非常复杂的表单,并且您希望在将所有内容写入数据库之前将某些地方的先前步骤中的数据存储起来。您可以将数据存储到会话中,但如果有人在多个浏览器选项卡中使用相同的表单,那么这将无法正常工作 - 因为会话数据将被共享。因此,为每个标签设置不同的存储空间会很不错。

示例#2:您希望允许用户在同一浏览器中登录多个帐户。所以你需要某种“fork”机制来进行会话。

2 个答案:

答案 0 :(得分:2)

  

但如果有人在多个浏览器标签中使用相同的表单,则无法正常工作 - 因为会话数据将被共享

为什么你不想在设置或获取另一包数据之前检查SESSION数组(验证)中的数据?

但我认为,更好的方法 - 使用客户端存储(例如LocalStorage)在服务器端验证之前设置一些数据。在高负载项目服务器端存储此类数据并不好。如果客户数据可以存储在客户端上 - 应该完成。

您说的是,当用户重新打开表单的第二步并重新输入数据时? (+请求服务器,++服务器加载)

答案 1 :(得分:1)

最好不要依赖会话状态,而是将数据存储在服务器端的临时存储中,并在表单的隐藏字段中包含密钥。

该键在向导的第一个屏幕中获取其值 - 即第一个表单 - 并从屏幕传递到屏幕。然后,无论用户打开了多少个标签,每个标签都会在表单中嵌入自己唯一的密钥。

即使您想在客户端存储表单数据,也可以使用它,尽管它更复杂。 Cookie具有名称,因此您可以使用每个表单的唯一ID作为Cookie名称,然后将值存储在Cookie中。当然,您必须确保cookie大小不超过4K。