首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测用户是否为同一会话打开了两个选项卡?

如何检测用户是否为同一会话打开了两个选项卡?
EN

Stack Overflow用户
提问于 2011-04-07 09:37:16
回答 4查看 29.4K关注 0票数 19

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

它的工作原理是,步骤1要求他们填写他们的信息。当转到步骤2时,步骤1中的信息将保存到session对象中。当它们在其他步骤中进行时,该过程重复。最后,当他们结帐时,所有数据都会保存到数据库中。

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

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

在用户结账的最后一步,Tab A中的信息与Tab B中的信息相同。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-07 10:00:57

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-04-07 09:47:28

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

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

对于服务器端实现,您只需要将当前的windowID与链接或post一起发送,这样服务器就可以从会话中清除windowID。然而,所有这些都不能防止用户同时打开Firefox会话和Chrome会话。

票数 2
EN

Stack Overflow用户

发布于 2011-04-07 09:54:35

您可以在第一步首次启动时将会话标记为已启动。确保服务器端遵循正确的步骤(即,在步骤1完成后,他们不会返回到步骤1,除非他们特别单击一个链接来执行此操作)。基本上,跟踪他们在服务器上的当前步骤,并根据需要进行更新。如果用户做了一些意想不到的事情,您可以让他们选择从头开始。

我想知道表单上带有时间戳的隐藏字段是否会有所帮助。不过也有些类似的想法。

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

对于跨浏览器支持,您需要将其与用户帐户或持久存在的内容相关联。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5574970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档