【问题标题】:PHP Session timed-out but AJAX calls still workedPHP 会话超时但 AJAX 调用仍然有效
【发布时间】:2014-02-21 18:25:58
【问题描述】:

我使用 Apache、PHP、MySQL 在本地主机上创建了一个内部 Web 应用程序。

一个用户在使用它并在他的浏览器窗口中打开了一夜。当他回到应用程序并再次开始使用它时,直到他尝试离开该页面时才收到超时消息,这很好(并且是理想的)但是他所在的页面有很多 AJAX 片段,他能够使用(调用)ajax 页面并让它们毫无问题地出现!他以为他在工作,但当他最终导航到应用程序中的另一个页面时,它启动到登录屏幕并且他没有保存任何内容。

一旦他调用了 AJAX 页面,我希望应用程序检查是否有会话 id,如果没有找到,则启动回到登录页面。我怎样才能做到这一点?

每个 AJAX 页面都是它自己的 PHP 页面,并且在页面的最顶部有对 session_start(); 的调用,它们会在调用自定义函数后立即检查是否通过查找某个会话变量的存在来记录用户。那不应该没有找到会话变量,然后根据需要重定向,或者如果找不到,它是否会尝试创建一个全新的会话?

我需要类似 session_continue 而不是 session_start 的东西。

这是 php.ini 文件的摘录,其中包含相关的会话信息。

; Whether to use cookies.
   session.use_cookies = 1

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor     = 1000

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 28888

【问题讨论】:

  • 如果页面上有 ajax,每个 ajax 请求都应该重置会话超时。如果碰巧会话超时并且发生了 ajax 事件,则它们可能被重定向到 ajax 请求的另一个页面(最有可能是登录页面),并且 ajax 响应不是预期的,导致 javascript 停止任何 ajax 时出错你有计时器。
  • 对不起,我稍微更新了问题,只要 session_start 被调用,在另一个名为 check_logged_in 的函数被调用并寻找 $_SESSION['logged_in'] = true 的存在之后立即.如果没有发现它会重定向到登录页面。应用程序中的每个页面都包含该功能以检查他们是否已登录。

标签: php ajax session-variables


【解决方案1】:

与其在不检查旧会话是否过期的情况下启动新会话,不如在发出start_session() 之前先进行检查。

您可以通过检查是否仍有客户端发送的会话 cookie(通常为PHPSESSION,只要您没有更改名称)来轻松完成此操作。一旦过期,当前(最后一个)会话就消失了,用户需要重新登录。

为了妥善处理这个问题并总结上述cmets,您首先需要:

  1. 检查是否有会话正在运行
  2. 检查是否在运行会话中,用户已通过身份验证
  3. 检查是否允许此用户提交当前操作

如果其中一项检查失败,请将他重定向到登录屏幕。然后,您可以终止任何正在运行的会话并使用新的会话 ID 开始一个新会话,以删除旧数据。

到目前为止,您在 php.ini 中所做的只是为旧会话数据设置垃圾收集。这是最后要做的。 “使用 cookie”将不会处理登录,例如对于您的应用程序,该应用程序当前像谷仓门一样打开,任何人都可以进入(“攻击”是错误的词)。

【讨论】:

  • 这符合我想做的事情。你能指出我的任何资源吗?根据我的 PHP.ini 文件,我已经在使用会话 cookie。
  • 我遇到的另一个问题是,在 php.ini 中,session.cookie_lifetime 设置为 0,这意味着它在浏览器重新启动时过期,而会话垃圾收集最大生命周期设置为 8 小时,所以浏览器说无限期,但服务器说8小时。这就是问题所在。我应该将这些值设置为相等的时间吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 2012-12-15
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多