我为我的网络应用程序实现了基于登录的普通PHPSESSID机制。困扰我的一个方面是简单的场景,其中用户孤儿在浏览器A中的会话(在计算机A上),在浏览器B中打开另一个(在计算机B上),孤立它以回到浏览器A,依此类推。可能所有这些都在PHPSESSID cookie有效的(合理冗长的)时间范围内。如果两个会话都显示用户静态数据,并且用户正在操作此数据,那么这两个浏览器不一定会显示与数据库中的数据一致的数据。
我对此方案的首选响应是第二次登录两次使第一次无效。我可以在数据库中保留一个与userID相关联的PHPSESSID。这很容易。现在困难的部分:在第二次登录时,如何使写入数据库的PHPSESSID无效,以便从第一个会话(现在已经失效的PHPSESSID)的后续访问将失败?
(我不能使用session_destroy(),因为它想杀死第二个PHPSESSID,我实际想要保留的那个。而且我不能使用setCookie(),原因完全相同。)
我的一个想法涉及数据库访问序列号。每个新请求都返回前一个加号。如果不按顺序,则session_destroy()是当前的查询者。我看到的轻微不便是需要额外的数据库提取来在每次用户访问之前恢复序列号。
有没有办法将此序列号与服务器缓存中某个不涉及任何cookie传输的位置的用户ID相关联?
感谢。
答案 0 :(得分:2)
我完全不明白你的问题,但我应该这样做。
如果将会话数据(包括SESSION_ID)存储在数据库中并向该表添加user_id,则可以在将PC B(由该用户)启动的新会话添加到数据库之前删除该用户的所有session_data 。当用户尝试在PC A上重新加载他/她的会话时,他/她的user_id和session_id的组合不存在,您应该将他/她记录下来。
答案 1 :(得分:0)
我认为没有问题。
在第二次登录时,您只需在数据库中写下第二个登录会话ID
这使前一个无效。