我下面的 解决方案#1 的这个答案。一段时间后,表中将出现一些多余的行。假设此表:
+------+------------------+ | user | cookie | +------+------------------+ | 1 | ojer0f934mf2... | | 2 | ko4398f43043... | | 2 | 34fjkg3j438t... | | 3 | 0243hfd348i4... | +------+------------------+
当用户1删除其浏览器的cookie时,数据库中仍存在此行:
1
| 1 | ojer0f934mf2... |
当他打开我的网站时,他需要再次登录。所以这是表格:
+------+------------------+ | user | cookie | +------+------------------+ | 1 | ojer0f934mf2... | -- now this row is useless anymore | 2 | ko4398f43043... | | 2 | 34fjkg3j438t... | | 3 | 0243hfd348i4... | | 1 | 0243hfd348i4... | +------+------------------+
将来肯定会增加这种无用的行的数量。那么我该如何管理呢?实际上,我可以创建一个EVENT,通过删除多余的行来 每天(每天) 清理该表。但这是问题所在:如何检测到它们?如何指定无用的行?
EVENT
编辑: 我可以添加一个新列并存储时间戳,然后通过EVENT (或cron作业) 删除所有旧的时间戳行。但这不是一个完美的解决方案。我希望Cookie在用户注销之前一直有效 (因此,我不喜欢Cookie的任何限制(或到期时间)) 。
现在,我正在寻找确定多余行 (而不是旧行) 的解决方案。
当用户注销时,在表中显式删除与其当前cookie相对应的行。
为了安全起见,您应该在cookie中的随机值中存储一个随机值,并将其存储在数据库表中cookie的安全散列中(例如SHA-2)。
为了与不再使用特定浏览器的用户打交道,请为“上次使用日期”存储另一个字段。一旦检测到用于访问应用程序的行的cookie,请立即更新此日期。
然后,您将希望调度的任务每隔一段时间运行一次,以清理最近未使用过的会话。