【问题标题】: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,看到代码会更好

标签: php javascript jquery session


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以尝试使用 cookie:

      1. 第一个页面加载,cookie被设置(由服务器用于会话)
      2. 下次加载同一页面时,它会读取 cookie
      3. 如果有 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,对吗?但同时,您希望用户能够刷新页面吗?另外,这是出于可用性考虑还是安全考虑?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2020-12-26
      相关资源
      最近更新 更多