7

我已经开发了这个 PHP Web 应用程序,它现在已经运行了几个月。突然,其中一位用户抱怨他可以登录,但只要他点击任何按钮,会话就会终止!同样的问题发生在不同的浏览器上。

经过一些测试,我意识到每次用户单击任何按钮时都会创建一个全新的会话 ID,可能是因为原始会话已过期。

不管出于什么原因,我看了一眼用户的计算机时钟,然后……惊喜!他的时钟是未来三个月!我不知道这样的事情是否与失败有任何关系,但我确实修好了时钟。仍然没有用。我删除了所有的cookies。依然没有。所以我重新启动了浏览器——然后它又开始工作了!

我得到的关于这个问题的最接近的信息是 Shimon Amit 对这个问题的回答。很好,现在我知道时钟“配置错误”是原因。问题是……我无法控制每个客户的计算机时钟。他们中的一些人将来可能会设置计算机时钟。

我的问题:有什么解决方案吗?有什么诀窍吗?我不希望客户面对这样的错误,因为他们可能会觉得它“蹩脚”并破坏他们对应用程序的信任,即使这并不是我的错(在某种意义上)。

4

5 回答 5

5

会话 cookie(与所有 cookie 一样)在客户端浏览器过期时受到控制和删除。即使您设置了一个遥远的过期日期(无论如何您可能不想这样做),客户需要做的就是将他的时钟进一步向前移动,它就会过期。

于 2012-10-31T15:30:18.340 回答
2

您可以将会话超时延长到以后的日期。也许您可以使用不会过期的 cookie(会话与客户端的 cookie 有关)否则,您的客户端浏览器只是在做它设计的事情。

编辑:Javascript 选项

这完全是一个技巧,但您可以使用 javascript 获取客户端计算机上的当前时间并将其发送回服务器,然后将会话 cookie 的超时调整为三个月后过期。见http://www.w3schools.com/jsref/jsref_gettime.asp

检索到客户端时间后,您可以使用 session_cache_expire() 重置会话过期时间。 http://www.php.net/manual/en/function.session-cache-expire.php

编辑:100% 服务器端选项

我想到的另一个选择是设置一个没有过期的会话 cookie,但跟踪 cookie 在服务器上设置的时间,比如在 MySQL 表中。您还需要跟踪上次活动。每当登录用户发出请求时,您都可以检查他们会话的开始时间和他们的最后一次活动。如果当前时间大于您可接受的超时时间,则销毁会话服务器端并将它们带回登录页面。如果会话仍然正常,则更新与该用户关联的最后一个活动,以便您可以比较下一个请求。无需客户端代码。

于 2012-10-31T15:30:48.877 回答
2

I fully agree with @MarcB's comment that you can't assume responsibility for how grossly misconfigured a user's machine could be. If you really want to make a difference in this regard I would suggest using PHP to output a small snippet of javascript that includes the time on the server. The snippet would compare that time to the time on the client computer and raise an alert if the time differs by more than X from the server. [say, 24hours or so]

于 2012-10-31T15:39:48.053 回答
1

有什么诀窍吗?

使用会话 cookie。不是 PHP 会话含义中的会话,而是浏览器会话。会话 cookie会一直保存到用户关闭浏览器。它们不受用户设置她计算机的时钟的影响。它们将持续到浏览器关闭。

这通常适用于与 PHP 会话相关的 cookie。

对于 PHP,您需要确保将会话 cookie 参数生命周期配置为0在会话开始之前。那是ini设置session.cookie_lifetime或调用session_set_cookie_params函数。

有关 cookie 参数的更详细说明,请参阅setcookie函数的文档。

技巧的第二部分是您将会话开始时间戳和最后活动时间戳放入 PHP$_SESSION中。这些是基于服务器的,因此始终具有相同的基础。

检查它们,例如会话是否太旧、上次活动太久等,销毁会话并强制用户再次登录。

您甚至可以使用技巧的第二部分将其与未来 10 年到期的 cookie 结合起来(好吧,浏览器可能不喜欢这样,也许您只想要三个月)。

于 2012-10-31T15:39:38.517 回答
-1

尝试禁用会话超时或至少将其设置为遥远的未来。这应该够了吧。

于 2012-10-31T15:29:55.880 回答