2011-08-23 40 views
0

我面临一个非常奇怪的问题,关于浏览器的cookie值。 我使用的是IE8,我想以这样的方式管理会话,当任何新用户尝试连接我的应用程序时,以前的实例应该会自动关闭。自动cookie值越来越集

为此,我为每个用户的登录尝试和递增设置cookie。 现在,这种情况在IE6中完美工作,但在IE8中,我面临的问题是: 当用户第一次登录时,cookie值设置为ex 1.现在我打开另一个IE8窗口并使用cookie值2再次登录。我转到前一个实例,cookie值也更改为2(应该为1)。

因此,应用程序不应该发生多个实例运行。 另外,当我从1个实例注销时,另一个会自动注销。 无论如何我一次只需要一个实例。 (这种情况在不同的浏览器中是完美的,即FF和IE,即在IE/FF中打开第一个实例,在FF/IE中打开第二个实例)。

+0

你有两个例子,即运行或只是1? – Woot4Moo

+0

我有2个IE运行的实例 – Ved

+0

同样的事情也发生在FF的2个不同窗口。 – Ved

回答

2

原因是IE的两个实例都将cookies写入相同的位置(cookies只是硬盘上的文件)。虽然它可能看起来像您的Web应用程序的两个不同客户端,但从前端开始,当您从第二个窗口登录时,Cookie将被保存为覆盖以前的Cookie。现在第一个实例只是看到新的cookie并将其快乐地发送到服务器。如果你只是去手动编辑cookie文件,也会发生同样的情况。这不是一个错误 - 这是饼干应该如何工作。请注意,如果您使用不同的计算机,您的预期行为将显示。

要防止来自同一台计算机和同一应用程序的多个同时会话,可以使用其他技术。例如,在客户端登录时,散列登录时间戳并将该散列保存在用户帐户中。然后将这个散列发送到每个页面,并让浏览器在请求新页面时将该散列发回给您。在服务器上,将从客户端接收到的哈希与存储在用户帐户中的哈希进行比较。如果它们不匹配,那么你在这个窗口中注销应用程序,因为显然另一个窗口已经完成了另一个登录。这将与同一应用程序的多个选项卡/窗口以及不同的窗口/计算机一起工作。我过去曾使用这种技术。当然,这不是完全万无一失(没有),但它在我需要的所有情况下都有效。

+0

非常感谢!我会尝试你告诉...再次感谢有效的解决方案... – Ved

+0

@ Aleks G:你可以请提供一些示例代码的事情,如何发送哈希值到客户端,以及客户端如何发送回服务器。我试图以这样的方式,当每个页面加载时将该值设置为隐藏字段并将该设置值发送到服务器以维持会话。但它不能正常工作。 – Ved

+0

@ adn295这几乎是我这样做的。除了我们将它传递给GET参数(next_page.php?hash = 12345678) –