页面不活动30秒后自动刷新页面并在php中销毁会话,没有任何用户交互?

时间:2016-02-27 21:09:45

标签: php session page-refresh

当用户在页面不活动30秒后按下刷新时,此代码可以正常工作,但我需要一些代码来在30秒不活动后自动销毁sassion和刷新页面。

  <?php
    $inactive = 30;
    ini_set('session.gc_maxlifetime', $inactive);
    session_start();

    if (isset($_SESSION['testing']) && time() - $_SESSION['testing'] > $inactive) {
        session_unset();     // unset $_SESSION variable for this page
        session_destroy();   // destroy session data
     echo "<br><br>Sorry, you can't go any further!!!";
     echo "<br>Please log in.";
     echo "<br/><a href='index.php'>Go back to login page</a>";
    }else{
    //Here is some code to do when the session is still active
    }

    $_SESSION['testing'] = time();
    ?>

1 个答案:

答案 0 :(得分:4)

有几种方法可以解决这个问题,具体取决于您希望如何通知用户 - 如果您只是希望在时间到期后重新加载页面 - 这将有效:

setTimeout(runAfterThirty, 30000);

function runAfterThirty() {
    alert("Your session expired - I am going to refresh the page now");
    location.reload(); 
}

如果放在页面的head标签中 - 基本上这将导致页面在30秒后刷新 - 这将导致您的PHP代码再次执行,这将产生您想要的效果。

如果你想要一个更好的用户体验 - 即不要让页面只是刷新但是给用户某种警告/提示某些事情即将到期 - 你需要使用javascript - 这样的事情会起作用(在页面上的脚本标记):

class User{
...

/**
 * @var Module $modules
 * @ORM\ManyToMany(targetEntity="Adm\Entity\Module", inversedBy="users", cascade={"persist"})
 * @ORM\JoinTable(
 *  name="user_module",
 *  joinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")},
 *  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
 * )
 */
protected $modules;

public function __construct() {
    $this->modules = new \Doctrine\Common\Collections\ArrayCollection();
}
...
}

在你的功能中,你可以放任何你想要的东西 - 你很可能想要改变页面的东西而不是刷新它。

无论哪种方式,页面都会被javascript刷新,这意味着您的PHP代码可以执行。你应该用PHP破坏会话。

如果您愿意,可以稍微改变一下 - 通过调用一个AJAX请求来触及一个旨在销毁会话的页面 - 但是看起来,基于您的代码 - 这是不需要的 - 但是这种方法是使用AJAX意味着用户的页面不需要刷新 - 逻辑将是这样的:

1)页面有一些javascript代码,在时间限制到期后调用函数(参见上面的代码) - 该函数然后将AJAX请求发送到另一个页面 2)另一页使php会话无效 3)调用页面向用户显示某种错误/消息,说明他们已超时

如果你想在真正的用户不活动后暂停,你需要这个:Detecting idle time in JavaScript elegantly,但是我不相信这些解决方案100%傻瓜证明(例如他们会在移动设备上完全破解)

现在 - 如果你想使用上面的链接 - 你将需要ajax - 因为你当前的代码不起作用 - 基本上(我不会在这里给你写一个AJAX教程) - 你需要使用javascript工作当你的超时达到时(使用上面的SO链接)然后点击服务器并告诉它使会话无效(阅读本教程以获取更多信息http://www.w3schools.com/ajax/

请注意,当用户不通过ajax使会话无效但刷新页面时,您需要决定要做什么 - 也就是说,用户可以阻止来自浏览器的所有ajax请求 - 这意味着他们永远不会自我失效会话即使它们处于非活动状态 - 但是你可能希望服务器在3分钟之后超时会话?这是所有应用程序设计的东西。