Laravel - Session
Laravel session lifetime 的概念
Session
💡
如果 expire_on_close 设置为 false 的话, lifetime 有效,如果 expire_on_close 设置为 true 的话, lifetime 的意义是最长的会话时间
Lifetime
生命周期 config('session.lifetime') 的默认时长是两个小时, 通过动态的修改这个参数可以设置用户 session 的时长
ExpireOnClose - 关闭浏览器时候 session 失效
配置 : session.expire_on_close
此项在浏览器关闭的时候清理掉 session
情景 1:
当 expire_on_close 设置为 true 时, 用户登录之后, 服务端 session 存储的最长时间为设定的 lifetime 的时间(当使用 redis 作为缓存的时候)
这种设置当 chrome 浏览器设置为 启动 时 继续上一次打开的网页 时候是无效的

🔗 https://stackoverflow.com/questions/10617954/chrome-doesnt-delete-session-cookies
情景 2:
当设置了 lifetime 的时候, 最长的会话时间则为 lifetime 的时间, 如果我们通过配置修改了 lifetime 的时间, 必须要保证这个时间比默认的时间要短, 否则会出现客户端未过期, 但是服务端已经过期的情况
更改 remember 的时间
当我们使用 Auth::login($user, $remember) 去进行登录的时候, 默认是永久的记录(5 年的时间) , 将 remember_{type}_hash.. 这个 cookie 写在客户端, 当 session 失效的时候通过这个凭证来重新唤醒 session
🔗 https://developer.chrome.com/blog/cookie-max-age-expires/
从Chrome M104版本(2022年8月)开始,cookie 的过期日期不能超过400天。这个变化不会影响会话cookie,即没有使用Max-Age或Expires显式设置过期日期的cookie,因为这些cookie在浏览会话结束时被清除。
你应该先获取 cookie 队列值,然后重置 cookie 过期时间。
$rememberTokenExpireMinutes = 20;
// 首先获取 记住我 这个 Cookie 的名字, 这个名字一般是随机生成的,
// First, get remember me cookie name. This is randomly generated.
$rememberTokenName = \Auth::getRecallerName();
$cookieJar = $this->guard()->getCookieJar();
$cookieValue = $cookieJar->queued($rememberTokenName)->getValue();
$cookieJar->queue($rememberTokenName, $cookieValue, $rememberTokenExpireMinutes);
$jumpUrl = '/user/xxxx';
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($jumpUrl);在 Laravel 9 可以设置单独的 remember 时间
<?php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
'remember' => 43800 // Set remember me duration here
],
],