当用户在页面不活动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();
?>
答案 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分钟之后超时会话?这是所有应用程序设计的东西。