我正在覆盖其中一个中间件(对于Laravel Web应用程序)中的session.timeout
值,但它似乎并没有影响会话的超时时间。虽然如果我调试它显示我已覆盖的值。
Config::set('session.lifetime', 1440);
默认值如下:
'lifetime' => 15,
我正在处理的网站对大多数用户的会话有效期非常短,但对于选定的用户,我希望提供延长的会话生命周期。
答案 0 :(得分:3)
看来,完成动态lifetime
值的唯一方法是在启动会话之前在中间件中设置该值。否则为时已晚,因为应用程序SessionHandler已使用默认配置值实例化。
namespace App\Http\Middleware;
class ExtendSession
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, $next)
{
$lifetime = 2;
config(['session.lifetime' => $lifetime]);
return $next($request);
}
}
然后在kernel.php文件中,在StartSession
之前添加此类。
\App\Http\Middleware\ExtendSession::class,
\Illuminate\Session\Middleware\StartSession::class,
答案 1 :(得分:3)
这是对我有用的工具(使用Laravel 5.6或5.5),让用户在登录时选择会话时长。
在Auth控制器中编辑会话的生存期无效,因为此时该会话已经启动。您需要添加在Laravel运行自己的“ StartSession”中间件之前执行的中间件。
一种方法是创建一个cookie,以存储用户的生命周期长度首选项,并在为每个请求设置会话到期时使用该值。
namespace App\Http\Middleware;
use Illuminate\Support\Facades\Cookie;
class SetSessionLength {
const SESSION_LIFETIME_PARAM = 'sessionLifetime';
const SESSION_LIFETIME_DEFAULT_MINS = 5;
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, $next) {
$lifetimeMins = Cookie::get(self::SESSION_LIFETIME_PARAM, $request->input(self::SESSION_LIFETIME_PARAM)); //https://laravel.com/api/6.x/Illuminate/Support/Facades/Cookie.html#method_get
if ($lifetimeMins) {
Cookie::queue(self::SESSION_LIFETIME_PARAM, $lifetimeMins, $lifetimeMins); //https://laravel.com/docs/6.x/requests#cookies
config(['session.lifetime' => $lifetimeMins]);
}
return $next($request);
}
}
在{em> \App\Http\Middleware\SetSessionLength::class,
之前添加\Illuminate\Session\Middleware\StartSession::class,
。
'lifetime' => env('SESSION_LIFETIME', \App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_DEFAULT_MINS),
要让用户选择自己喜欢的分钟数,请添加一个分钟数下拉列表,例如以<select name="{{\App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_PARAM}}">
开头。否则,将上面的SetSessionLength.php
更改为不从$request->input
提取,而是从其他地方检索,例如该用户的数据库记录。
答案 2 :(得分:1)
出现问题导致您的用户登录,之后您正在更改会话生存期配置变量。变量已针对当前请求进行了更改,但用户在登录时指定了的会话。
您必须更改登录方式。并执行以下步骤:
config(['session.lifetime' => 1440]);
我建议使用帮助器动态更改配置
config(['session.lifetime' => 1440]);