【问题标题】:How to keep session alive without reloading page?如何在不重新加载页面的情况下保持会话活动?
【发布时间】:2012-09-17 19:26:45
【问题描述】:

我的在线考试管理系统有一个奇怪的问题。

测试表单(test.php)中的一些用户需要很长时间才能回答问题并提交表单。

提交表单后会话过期,用户必须重新登录

这不是代码问题

我将此值设置在所有页面的顶部

ini_set('session.gc_maxlifetime', 18000);

有没有办法在不重新加载测试表单中的页面的情况下刷新会话 evrey 10 分钟以防止会话过期?

请帮帮我

谢谢

【问题讨论】:

  • 可以做一些ajax调用吗?你能再描述一下你的剧本吗?可能是一些代码示例会有所帮助:)
  • 有趣。我正在处理类似的问题,但我对此事的看法是,应该避免每隔一段时间自动重置会话超时,因为这将有效地创建一个无限会话,只要浏览器窗口打开,该会话就会持续存在。相反,我建议应该增加您的最大生命周期,并且可以根据用户操作刷新超时。甚至鼠标移动也可以做到这一点,一旦鼠标移动就启动一个计时器。除非包含一些用户交互组件,否则它会产生很大的安全漏洞。会话旨在过期。

标签: php session cookies


【解决方案1】:

您可以使用 javascript XHR,或者其他人称之为 AJAX。

使用 ajax,您可以调用每 10 分钟刷新一次会话的 php 脚本。 :)


这是我所能达到的“精确”。

javascript

var refreshSn = function ()
{
    var time = 600000; // 10 mins
    setTimeout(
        function ()
        {
        $.ajax({
           url: 'refresh_session.php',
           cache: false,
           complete: function () {refreshSn();}
        });
    },
    time
);
};

// Call in page
refreshSn()

刷新会话.php

<?php
session_start();

// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>

无论如何,另一种解决方案是延长测试页的会话时间,仅使用 这里提出的解决方案

How do I expire a PHP session after 30 minutes?

【讨论】:

  • 在PHP脚本中,session_start()不够吗?
  • setInterval(function(){$.post('path/to/refresh_session.php');},600000); - 你可以用这一行替换整个 JavaScript 函数
  • @myfunkyside:您的 oneliner 还具有不会堆积在调用堆栈上的优点。当然,延迟 10 分钟的递归函数大约需要 100 天才能超过最大堆栈大小,但小心使用递归函数是一种很好的做法。
  • “settimeout”应该是“setTimeout”
  • 它只是在保持页面打开状态下工作,如何防止页面关闭时破坏会话?我的意思是当页面没有打开时如何保持这个?我在 php.ini 中测试了 gc_maxlifetime 但不起作用。!
【解决方案2】:

你所需要的就是这个(使用 jQuery 作为 $.post):

JavaScript(把它放在你的 onload-function 里面)

setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes

refresh_session.php

<?php
  session_start();

  if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well
    $_SESSION['token'] = $_SESSION['token'];
  }
?>

(我知道这与公认的答案几乎相同,我真的很想对此发表评论,但我还没有足够的声誉。
最大的变化是在 JavaScript 中,你不需要一个完整的函数,只需要一行。)



额外信息:

虽然我认为只需在 php 中调用 session_start() 就足够了,如果我没看错的话 (http://nl3.php.net/function.session-start):

读取回调将检索任何现有的会话数据(存储在 特殊的序列化格式)并将被反序列化并用于 读取时自动填充 $_SESSION 超全局变量 回调将保存的会话数据返回给 PHP 会话处理。

在测试过程中,我只将上述代码放在我的访问者页面上,而不是放在管理页面上。但是我在同一个浏览器(Chrome)中打开了两个页面,并且管理页面也保持登录状态,至少一个多小时(不再检查)。 但是,我不知道如果你只使用session_start(),它是否仍然有效,根本不需要手动刷新任何 session-var..

无论哪种方式,我都希望确保我需要的会话变​​量确实仍然存在:)

【讨论】:

  • 您的“额外信息”似乎不是真的。我有同样的问题。向服务器创建了一个 ajax 调用(ping/pong),试图让我的会话保持活动状态。出于测试目的,每 5 分钟运行一次。不管怎样,我在大约 2 小时后被取消身份验证。现在尝试更改会话。
  • @FlipVernooij 那么“会话更改方法”是如何进行的?
猜你喜欢
  • 2012-08-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多