我开发了这个PHP Web应用程序,现在运行了几个月.突然,其中一个用户抱怨他能够登录,但是一旦他点击任何按钮就会终止会话!同样的问题发生在不同的浏览器上.
经过一些测试后,我意识到每次用户点击任何按钮时都会创建一个全新的会话ID,这可能是因为原始会话已过期.
无论出于何种原因,我都瞥了一眼用户的电脑时钟......惊喜!他的时钟在未来3个月!我不知道这件事是否与失败有任何关系,但我确实修好了时钟.它仍然没有用.我删除了所有的cookie.依然没有.所以我重新启动了浏览器 - 然后它再次开始工作!
我得到的关于这个问题的最接近的信息是Shimon Amit对这个问题的回答.好,现在我知道时钟"错误配置"是原因.问题是......我无法控制每个客户的计算机时钟.他们中的一些人将来可能会设置他们的计算机时钟.
我的问题:这有什么解决方案吗?任何诡计?我不希望客户面对这样的错误,因为他们可能会发现它"跛脚"并打破他们对应用程序的信任,即使这不是我的错(在某种意义上).
您可以将会话超时延长到以后的日期。也许您可以使用不会过期的 cookie(会话与客户端的 cookie 相关),否则,您的客户端浏览器只是执行其设计的操作。
编辑:Javascript选项
这完全是一个 hack,但是您可以使用 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 表中。您还需要跟踪最后的活动。每当登录用户发出请求时,您都可以检查他们的会话的开始时间和最后的活动。如果当前时间大于您可接受的超时时间,则销毁会话服务器端并将它们带回登录页面。如果会话仍然正常,则更新与该用户关联的最后一个活动,以便您可以对下一个请求进行比较。无需客户端代码。