避免两次打开同一页面

Posted

技术标签:

【中文标题】避免两次打开同一页面【英文标题】:Avoid opening the same page twice 【发布时间】:2011-04-12 09:52:12 【问题描述】:

我正在尝试找到解决此问题的方法:我在 php 应用程序上有一个页面,该页面不能多次打开以避免会话覆盖。 我花了很多时间没有找到任何解决方案!

我尝试的最后一个是在窗口上使用 jquery "load" 和 "unload" 事件。如果我在新窗口或新选项卡中打开同一页面,它可以正常工作,但如果我刷新它也会阻止页面!

我真的不知道该怎么办了!我认为这是一个信号量使用的简单示例……但我无法以正确的方式对其进行编码。

有什么建议吗? (欢迎使用php和js两种解决方案)

【问题讨论】:

我们可以看看你在 PHP 上的尝试,以及你的 jQuery 尝试的 javascript 根据 Jquery 手册,页面刷新首先触发unload:api.jquery.com/unload,因此您的信号量应该在刷新时被删除。根据@RobertPitt,看到代码会更好 【参考方案1】:

我想,同一用户不能多次打开。

你是如何使用 jquery 的加载和卸载事件的?这里集思广益,如何使用load 在用户会话中设置一个信号量,由unload 删除。当然,即使浏览器崩溃或类似的不可预见的技术问题,我也不确定该事件是否会触发。在这种情况下,您可能会遇到一个卡住的问题,您需要一个特定的超时时间,或者等待会话超时。

为了解决这个问题,也许在页面加载后有一个每 10 秒执行一次的计时器,基本上更新类似于“页面仍然打开”的信号量以及当前时间戳。如果加载时信号量存在但时间戳早于 10 秒,则用户正在刷新。

【讨论】:

【参考方案2】:

问题在于您无权访问当前在浏览器中打开的最终用户页面。因此,唯一的解决方案是让您继续跟踪用户打开/关闭/切换到另一个页面/等的页面。即使这样也不完美,因为用户可以打开另一个浏览器进程。所以没有完美的解决方案。

【讨论】:

【参考方案3】:

您可以尝试使用 cookie:

    第一个页面加载,cookie被设置(由服务器用于会话) 下次加载同一页面时,它会读取 cookie 如果有 cookie,请不要覆盖会话变量

我不认为浏览器能够在刷新和加载另一个选项卡/窗口之间产生差异。

【讨论】:

或者如果使用 html5,您可以使用 HTML5 的客户端网络存储而不是 cookie :)【参考方案4】:

对不起,伙计们……你是对的! 一些代码将帮助我们所有人:) 假设我的脚本是 script.php

在我放的script.php的html中

$(window).bind('load',
function()
    $.post(PATHTOLOCK.php);
);
$(window).bind('unload',
function()
    $.post(PATHTOUNLOCK.php);
);

在文件 PATHTOLOCK.php 我这样做:

$_SESSION['flag']=true;

在文件 PATHTOUNLOCK.php 我这样做:

$_SESSION['flag']=false;

我把script.php放在开头

if($_SESSION['flag']==true)
echo "error";exit;

如果我在两个窗口/选项卡中打开 script.php,一切正常。如果我刷新页面它不起作用,因为我认为事件顺序如下:

点击刷新 未调用卸载事件,因为页面未完全离开 script.php 正在重新加载 script.php 开头的检查失败,因为 flag=true script.php 出错 unload 事件被调用,因为页面被留下并且 flag=false 点击刷新 现在可以了!

等等……每两次刷新一次就可以了!

【讨论】:

@OTZ 我也是这么想的!但是我如何跟踪页面?尤其是关闭的页面!还有,我如何区分关闭的页面和刷新的页面? 你能更好地解释一下你在这里的实际目的吗?让我看看我是否理解...用户在 Chrome 的选项卡中访问 script.php。您不希望用户能够在 Chrome 的第二个选项卡中加载 script.php,对吗?但同时,您希望用户能够刷新页面吗?另外,这是出于可用性考虑还是安全考虑?

以上是关于避免两次打开同一页面的主要内容,如果未能解决你的问题,请参考以下文章

在同一秒内修改两次的页面是不是会中断 If-Modified-Since?

如何在opencart的同一页面上两次使用相同脚本中的脚本?

如何避免重定向两次(react-router-redux)?

如何在同一页面中使用相同的javascript过滤器两次使用不同的表?

使用ajax从mysql DB检索和打印数据到文本框(如何在同一个php页面中使用它两次)

JS实践遇到问题,多个变量多个页面如何避免出错