0

我见过像我这样的各种问题,尽管没有一个提供正确的答案。我有一个 PHP 脚本:

session_start();
setcookie(session_name('DSWLogin'),session_id(),time()+2*7*24*60*60, '/');

//This will only be set once (when the user logs in)
$_SESSION['test'] = 'Yup, I am working';

if (isset($_SESSION['test'])){
echo 'Session is set and ready!';
} else {
echo 'No session was set...';
}

并且一切正常,除非在浏览器重新启动后,我的 PHP 脚本忽略了会话。

当我的浏览器还没有重新启动时,它会echo 'Session is set and ready!';很好。当我查看我的 cookie 选项卡时,它确实显示了一个名为的 cookie,DSWLogin已设置了某个值。

当我重新启动浏览器时,我的 cookie 选项卡仍然显示一个名为的 cookieDSWLogin已设置为与重新启动前相同的值,所以它仍然存在! 但是我的 PHP 脚本显然忽略了 is,并输出'No session was set...'...

提前致谢,

以赛亚诉胡南

4

3 回答 3

2

你试图做的并不是实现这一目标的正确方法。会话有两部分,一个 cookie,其会话 id 默认设置为在会话结束时过期(通常是浏览器关闭)和一个服务器端存储机制,在收到最后一个请求后的一段时间后自动清理.

您要做的是将会话延长至两周。虽然您可以更改 cookie 设置并增加会话垃圾收集的超时时间,但这样做并不是很可靠。

相反,您希望查看使用存储在 cookie 中的一次性密钥,该密钥充当备用登录路径。这个 cookie 可以像正常登录一样重新创建会话。为了保持安全,需要考虑一些细节,但它会完成您想要实现的目标。

于 2013-06-25T20:01:53.823 回答
0

仅仅因为您在某些 cookie 中设置 session_id 并不意味着它是会话 cookie。大多数浏览器会在浏览器关闭时清除会话 cookie。这就是你所看到的。查看会话有效时设置的浏览器中的 cookie,并将其与浏览器重新启动后仍保留的 cookie 进行比较。您会注意到您的真实会话 cookie 已丢失。

于 2013-06-25T19:59:56.110 回答
0

Quoting the manual:

The session name is reset to the default value stored in session.name at request startup time. Thus, you need to call session_name() for every request (and before session_start() or session_register() are called).

Also if you want to change lifetime of session cookie, use session_set_cookie_params instead of forcing your own cookie.

Also read about session garbage collection and configuration, changing cookie lifetime might not be enough.

于 2013-06-25T20:12:24.847 回答