如何避免打开两个浏览器窗口


How to avoid opening two browser windows?

我想避免打开两个应用程序窗口(或选项卡)的可能性。如果我的应用程序(LAMP+Javascript)安装在上http://www.domain.com并且用户正在浏览页面http://www.domain.com/user/他/她不能像那样打开另一个窗口http://www.domain.com/system/。如果他/她打开另一个窗口,应用程序应该显示一条错误消息。

这可能吗?

对于好奇的人:我需要这种行为,因为我的应用程序使用一些会话数据来识别动作序列。如果用户在同一个浏览器上打开一个新窗口,通常一切都是正确的,但如果他/她启动一个新序列,(另一个窗口中的)前一个序列将丢失。

虽然其他人在这里说你不能阻止某人打开你的网站两次是正确的,但你可能有一个变通办法。请注意,这不是一个100%的解决方案,需要您在此基础上开发进一步的代码。

据我所知,你有以下问题:

  1. 如何确定用户是否使用共享会话数据的窗口/标签打开了您的页面(即Chrome中的两个选项卡、2个Chrome窗口等),这是最简单的部分
  2. 如何确定用户是否在不同的浏览器中打开了你的页面(即一次在FF&Chrome中打开)——这是一个棘手的问题

但是,您可以使用LSO本地共享对象来实现这一点。这些是存储在客户端的基于Flash的类似cookie的数据块。他们是CROSS-BROWSER&跨域兼容。你可以在这里找到一个名为EVERCOOKIE的不错的库来使用它们。

通过设置这样的cookie,您将能够跟踪用户,即使他打开了一个新窗口,或者即使他在不同的浏览器中打开了您的页面,只要浏览器共享相同的Flash安装等。

请注意,这不会阻止某人直接打开两个窗口,但它使您能够将他发送到与他在另一个窗口中相同的序列状态。

您还应该意识到,这不是一个100%的解决方案。总会有一些技巧来绕过这一点,尽管我认为普通用户无法获得它…

您不能阻止某人打开您的网站两次。

你可以为每一页使用一个新的会话密钥,但这可能会有点麻烦。。。

如上所述,您无法阻止某人打开您的网站两次。然而,正如我所见,你的问题是要确保每个浏览器会话都是唯一的。有很多方法可以实现这一点,其中一种方法是由客户端生成一个随机数,并通过ajax将其发送到后端以使用,而不是会话id,您可能会遇到一些持久性问题,但这些都很容易解决。

如果用户登录到其他,我能想到的唯一方法就是隐藏/删除内容

因此,您需要a)用户登录。。。以及b)记录用户何时登录。。。以及c)记录用户何时退出

这种方法仍然存在问题——你什么时候决定用户何时关闭浏览器,应该从"登录"列表中删除。。。

简而言之,答案是你无法可靠地阻止这种情况。。。。

我会使用服务器端的会话(即php)来完成这项工作,并利用load和window.unload事件来设置和销毁会话。

如果已经创建了会话,那么在此之后打开的任何窗口都应该检查会话值,并在显示错误消息后强制关闭。