PHP怎么判断用户是不是同一个人,关于php:如何检测用户是否为同一会话打开了两个标签?...

我已经使用CakePHP完成了一个预订应用程序,其中涉及到结帐页面之前的几个步骤。在这些步骤之间,我将信息存储在会话中。

步骤1要求他们填写信息。转到步骤2时,步骤1中的信息将保存到会话对象中。当它们继续进行其他步骤时,该过程将重复。当他们结帐时,所有数据随后都保存到数据库中。

如果用户在浏览器中打开该应用程序的一个实例,则一切工作都很好。但是,一旦他们在同一浏览器中为同一应用程序打开了另一个页面或另一个选项卡,就会发生问题。

假设他们在选项卡A和选项卡B中打开了应用程序的两个实例。在选项卡A中,他们在步骤1中输入了详细信息,然后继续执行步骤2。然后,用户在选项卡B中执行了相同的操作。

在用户进行结帐的最后一步,选项卡A中的信息与选项卡B中的信息相同。

现在,我只能认为最好的方法是防止用户在两个浏览器实例中打开同一应用程序。

当他们尝试在选项卡B中打开另一个实例时,是否有一种方法可以检测并提示用户首先在选项卡A中完成预订表单?

1.相同的问题(和解决方案):https://sites.google.com/site/sarittechworld/track-client-windows

2.您可以通过POST或GET发送信息

您可以在第一次启动步骤1时将会话标记为已启动。确保服务器端遵循正确的步骤(即,除非完成第1步,否则除非明确单击链接,否则它们不会返回第1步。)基本上,在服务器上跟踪其当前步骤并进行更新如所须。如果用户做了意外的事情,您可以给他们选择重新开始的选项。

我想知道表单上带有时间戳的隐藏字段是否有帮助。虽然有点相同的想法。

注意:此过程可能会破坏浏览器后退按钮的本质。我讨厌自己让这发生在我的一个项目中。

为了获得跨浏览器的支持,您需要将其与用户帐户或永久存在的内容相关联。

当然,您可以使用客户端轮询器脚本来实现。在JavaScript中,您可以生成一个窗口ID,可以保证它唯一,只要它是唯一的即可。让JS使Ajax调用者到达服务器上的端点,该端点除了比较ID和会话外什么都不做。在任何时候,如果您有两个不同的" windowID"值,就知道它们必须为同一会话打开窗口。

您可以将其作为会话中的数组存储在服务器端,甚至可以将其完全存储在cookie的客户端中。如果选择这样做,则客户端轮询器将仅查看cookie值,并且如果它包含两个不同的值,则表示存在问题。 Cookies不太理想,因为它们会增加请求/响应周期的重量,并且您必须设置一种机制来在用户卸载页面时清除当前页面的值。

对于服务器端实现,您只需要发送当前windowID以及链接或发布,以便服务器可以从会话中清除windowID。但是,这一切都不能防止用户同时打开Firefox会话和Chrome会话。

正如本杰明指出的,您可以通过提供每个窗口的ID来实现此目的,然后随每个请求将其报告给服务器。如果要启用多窗口用例,我认为这是最合理的方法。

我认为您不需要通过ajax来轮询服务器。只要对服务器的每个请求都包含窗口ID,就可以消除服务器端与该请求相关联的会话的歧义。这意味着您必须更改服务器端代码以将窗口ID包含在会话中。

但是,该方法具有严重的缺点。例如,如果用户同时关闭了Tab A和Tab B,然后打开了一个新的Tab C ...会发生什么?他们应该重新连接哪组数据?

如果需要防止将多个选项卡的状态混为一谈,将用户限制为单个选项卡的方法听起来很合理。

您可以通过"本地存储"顺便说一句。如果您在客户端上生成一个随机ID,然后通过诸如window.localStorage.setItem('window_id', );之类的调用将其推入本地存储,则可以在页面加载时检查此值。如果该值在页面加载时存在,则您可以清楚地看到至少有一个其他窗口处于打开状态。您必须确保在页面卸载时删除此值,否则无效会话可能会触发误报。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值