【问题标题】:How to deal with a PHP session timeout如何处理 PHP 会话超时
【发布时间】:2018-01-24 08:21:07
【问题描述】:

我有一个显示时间表的网页区域,用户可以单击左右来前进/后退一周:

<script type="text/javascript">
 var TimesheetOffset = 0;
 function TimesheetNav(AdjustBy) {
   TimesheetOffset = TimesheetOffset + AdjustBy;
   $("#timesheets").load("populate_timesheets.php?start=" + TimesheetOffset);
 }
</script>

populate_timesheets.php 脚本在 ID 为“timesheets”的 DIV 区域中显示时间表信息,但前提是用户已登录且他们的会话未过期 - 如果会话已过期,则会显示登录页面:

    if (!isset($_SESSION['login_user'])) {
        header("location: index.php");
    }

问题在于,如果会话超时,index.php 脚本会出现在应该显示时间表的位置,而不是替换整个页面。如何更改 PHP 或 JavaScript,以便在会话超时时登录页面替换整个页面?

【问题讨论】:

  • 您可以将$("#timesheets").load() 更改为您可以处理响应代码的内容。您还可以轮询服务器以保持会话处于活动状态或在超时的情况下重定向..您还可以更改会话上的 gc 以使其停留更长时间。到目前为止,您尝试了很多事情?
  • 您不能从后台请求重定向“前端”。您需要在前端 in 执行此操作,这意味着使用 JavaScript 重定向到登录页面。所以你的服务器端脚本只需要返回一个 value 给你的 JavaScript,它可以作为这个决定的依据。这可能意味着您一开始就不想使用 .load,因为它没有内置的那种功能。因此,“正常”的 AJAX 请求可能是更好的选择,它可以让您更灵活地应对两种不同的情况。

标签: javascript php jquery


【解决方案1】:

JavaScript 代码:

$.ajax("populate_timesheets.php?start=" + TimesheetOffset, {
   type: "GET",
   statusCode: {
      401: function (response) {
         // redirect to login page
      }
   }, 
   success: function (data) {
      $( "#timesheets" ).html(data);
   },
   error: function (error) {
      console.log('Error occured: ', error);
   }
});

PHP 代码:

if (!isset($_SESSION['login_user'])) {
    header("HTTP/1.1 401 Unauthorized");
    return;
}

我不测试这段代码,所以如果你有问题,请阅读关于 AJAX 请求的 jQuery 文档:)

【讨论】:

  • 我已经尝试过该代码,但由于某种原因它现在没有填充timesheets DIV - 你能检查一下吗?
  • 我忘记在 $.get 中为回调函数添加参数。现在试试,我更新了我的答案。
  • 谢谢,它现在填充得很好,但是当会话超时时,登录页面仍然出现在 timesheets DIV 中,而不是整个页面
  • 所以用return语句替换重定向。你也可以使用 http-response-code(php.net/http_response_code)
  • 对不起,这看起来是一个非常有前途的解决方案,但我无法让它工作,在 .fail 函数中我重定向到登录页面,但它似乎没有触发即使它收到 401 代码。
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 2012-09-16
  • 2014-03-22
  • 1970-01-01
  • 2011-09-25
  • 2012-03-08
  • 2017-10-06
  • 2012-08-16
相关资源
最近更新 更多