标题几乎概括了我的问题。
我工作的公司有一个 Laravel 应用程序,其中 config/session.php 上的会话时间设置为 120 分钟后过期,这是默认行为我们不想改变这个值。
但是系统有一个特定功能,用户必须回答大量的表格/调查问卷,如果用户打字速度慢,可能需要超过 3 或 4 个小时才能完成在提交之前返回重新考虑一些答案。
问题是,一些用户仍未完成所有问题,会话过期使他们失去进度,有时他们只有在几分钟后切换到问题的“下一页”时才发现会话过期。我们考虑过保存已经填写的数据,但即使我们用 AJAX 调用持久化内容,将已经填写的部分保存到数据库中,在回答表单时需要再次登录仍然是一个糟糕的用户体验,因为他们需要遵循无论如何,再次链接进入表单页面。由于会话过期,我们收到了很多客户的投诉。
最好的方案是在 FormController.php 上创建某种函数,当用户进入表单页面或其他一些特定路由时,我们会执行类似 session() 的操作->extendSessionInMinutes(360)。我做了一些研究,但在 Laravel 文档(请注意我们使用的是 Laravel 8.1)或 Stackoverflow 上找不到类似的内容。本周阅读了有关此主题的很多内容,例如有关创建新中间件的解决方案,该中间件根据用户角色或类似内容提供不同的会话生命周期,但此选项对我们来说没有用。
我正在开发一个解决方案,该解决方案将使用类似的解决方案在会话上添加新变量 session()->put('time_to_logout', now()->addHours( 2)) 了解会话达到 2 小时的确切时间,因此我可以将 SESSION_LIFETIME 的默认值的生命周期增加到 5 小时,并添加JS 函数每 30 分钟检查一次,是否需要注销并将用户重定向到注销页面,如果他在表单页面上,我们将停止检查。
但我认为这实际上不是一个好的解决方案,但我似乎无法考虑另一个解决方案。有没有办法通过以某种方式延长会话时间来完成我想要的事情?或者在不影响用户的情况下重新创建会话(我敢打赌,这会弄乱表单上的 CSRF 令牌),并且在他继续填写表单的同时,用 2 个小时以上的时间无缝地重新创建会话,没有注意到任何变化?
创建会话后,无法更改其过期时间吗?是否有某种 PHP 库可以帮助我,而无需更改太多 Laravel 默认会话相关功能?
提前感谢您的任何意见。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
是的,可以。并且您需要执行以下操作-
namespace App\Http\Middleware; class ChangeSessionValueDynamically { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, $next) { $lifetime = 1440; /* Minutes*/ config(['session.lifetime' => $lifetime]); /* Helper function */ return $next($request); } }在
\Illuminate\Session\Middleware\StartSession::class,之前添加\App\Http\Middleware\ChangeSessionValueDynamically::class,。/** * The priority-sorted list of middleware. * * This forces non-global middleware to always be in the given order. * * @var array */ protected $middlewarePriority = [ .... .... \App\Http\Middleware\ChangeSessionValueDynamically::class \Illuminate\Session\Middleware\StartSession::class, .... .... ];\App\Http\Middleware\ChangeSessionValueDynamically::class的别名,如下所示 -/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ .... .... 'dynamic_session' => \App\Http\Middleware\ChangeSessionValueDynamically::class, .... .... ];A) For Group Routes- Route::group([.., 'middleware' => ['dynamic_session', ..]], function () { .. Route::get('route_1', ['uses' => 'AbcController@index', 'as' => 'abc.index']); .. } B) OR For single Route- Route::get('route_1', ['uses' => 'AbcController@index', 'as' => 'abc.index'])->middleware('dynamic_session');