2010-08-31 60 views
0

我拥有为我的web应用程序实现的一流的基于登录的PHPSESSID机制。困扰我的一个方面是用户在浏览器A中孤立他的会话(在计算机A上),在浏览器B中(在计算机B上)打开另一个浏览器,孤立它以回到浏览器A等等。可能所有这些都在PHPSESSID cookie有效的(合理冗长的)时间范围内。如果两个会话都显示用户静态数据,并且用户正在操作这些数据,那么这两个浏览器不一定会显示与数据库中数据一致的数据。如何管理跨浏览器的PHP会话

我对这种情况的首选回应是第二次登录两次使第一次无效。我可以在数据库中保留一个与userID关联的PHPSESSID。这很简单。现在最困难的部分是:在第二次登录时,我如何使写入数据库的PHPSESSID失效,从而使第一次会话(现在失效的PHPSESSID)的后续访问失败?

(因为要杀死第二PHPSESSID,一个我其实想保持我不能使用session_destroy()。我不能完全相同的理由使用setcookie()函数。)

我有一个想法涉及数据库访问序列号。每个新请求都会返回前一个加号。如果顺序不正确,session_destroy()当前查询者。我所看到的稍有不便之处在于,它需要额外的数据库提取才能在每个用户访问之前恢复序列号。

是否有任何方法将此序列号与服务器缓存内某个用户ID相关联,该用户ID不涉及任何cookie传输?

谢谢。

+3

我并不完全同意这首先是一个问题。如果用户暂时处于非活动状态,是不是一直有数据在服务器端发生变化的可能性?为什么要剥夺用户使用他想要的任何浏览器的自由?用户界面不应该更新问题吗? – 2010-08-31 07:48:54

+0

不可以。数据不会自动改变。今天的家庭有这么多电脑。用户可以在他的桌面上打开一个会话,并在他的笔记本电脑上放置另一个会话。如果一个人不知道另一个,他们都会显示垃圾。 (这是Ajax,我不刷新屏幕,会话只是向数据库通知更新,应用程序的推测是它随时知道数据库的状态,因为它驱动所有更新,在登录时记录。) – Ollie2893 2010-08-31 07:54:57

回答

2

我完全不理解你的问题,但这是我该怎么做的。

如果您将会话数据(包括SESSION_ID)存储在数据库中,并且将user_id添加到该表中,则可以在将PC B(由该用户)启动的新会话添加到该用户的所有session_data之前删除该用户的所有session_data数据库。当用户尝试在PC A上重新加载他/她的会话时,他/她的user_id和session_id的组合不存在,您应该将他/她注销。

+0

公平点。更容易的计划。仍然需要在每次访问之前进行数据库提取,但我认为缓存的想法并没有什么好处:Web服务器维护文件系统上的所有会话数据。所以无论是文件系统访问还是数据库访问。很多很多。两者都可以维护内存缓存无论如何经常访问的数据项... 我不认为我可以按照您在句子1中描述的方式(无法访问会话A的cookie)删除会话数据。但是,我可以像删除第2句中所描述的那样删除它(现在是正确的上下文A)。 – Ollie2893 2010-08-31 08:55:45

0

我没有看到这个问题。
在第二次登录时,您只需在数据库中写入第二个登录会话标识。
这使前一个无效。