繁体   English   中英

在PHP / CodeIgniter中使用重新生成会话ID

[英]Working with regenerating session id in PHP/CodeIgniter

我正在使用CodeIgniter的Session类来管理购物车/结帐系统的会话。 会话数据存储在数据库中,会话ID存储在cookie中。 所有购物车信息都通过AJAX检索并与会话ID一起保留在会话中。

现在,我使用PHP / CodeIgniter生成的会话ID来跟踪用户。 用户没有登录到该站点,并且商店和购物车/结帐系统位于不同的域,因此这是将他们绑定到存储在会话/数据库中的购物车的唯一方法。 我在表单上的隐藏字段中使用此会话ID,并在链接中将其用作参数,以便在任何请求(添加项,删除项,查看购物车等)上将其发送到服务器。

CodeIgniter允许您设置一个时间来重新生成会话ID,现在我将其设置为10分钟。 我默认使用它,但是它太短了,因为如果用户在页面上坐了太长时间,则动态写入链接和表单的会话ID将会过时并且不再与购物车数据绑定。

这显然不是一个很好的解决方案。 允许以较低的时间间隔重新生成会话ID,但即使用户等待10分钟以上(不刷新页面)来执行操作,仍然使用户与购物车数据保持联系的最佳方法是什么?

不要在数据库中使用会话ID。 购物车应跨会话保留,因此您需要存储与用户(而不是会话)相关的购物车。 我也不会将会话ID放在字段中作为隐藏字段。 会话的好处是您可以将它们存储在服务器端。

将购物车存储在数据库中,不要将整个内容加载到会话中。

方法1

可以在数据库中为用户提供“活动”购物车。

User -> (has many) Cart

然后通过向购物车中添加商品来更新该购物车

/cart/add/{id}        -> Verify prices / quantities

该购物车未链接到会话,会话仅控制登录的用户。当他们签出时,将购物车从“活动”设置为“有序”,并创建一个新的“活动”(但为空)购物车。 会话之间的购物车将保留在数据库中,并且可以提供完整的历史记录。

方法#2

将整个购物车存储在会话中,而不是针对数据库进行备份。 这会使某些事情变得更简单(添加/删除项不是数据库操作),但也不会在会话之间持久化。 当用户签出时,将购物车写入数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM