在 Laravel 中,是否可以根据访问的路由动态延长会话时间?
P粉019353247
2023-09-01 17:36:54
<p>标题几乎概括了我的问题。</p>
<p>我工作的公司有一个 Laravel 应用程序,其中 <code>config/session.php</code> 上的会话时间设置为 <strong>120 分钟</strong>后过期,这是默认行为我们不想改变这个值。</p>
<p>但是系统有一个特定功能,用户必须回答大量的表格/调查问卷,<strong>如果用户打字速度慢,可能需要超过 3 或 4 个小时才能完成</strong>在提交之前返回重新考虑一些答案。</p>
<p>问题是,一些用户仍未完成所有问题,会话过期使他们失去进度,有时他们只有在几分钟后切换到问题的“下一页”时才发现会话过期。我们考虑过保存已经填写的数据,但即使我们用 AJAX 调用持久化内容,将已经填写的部分保存到数据库中,在回答表单时需要再次登录仍然是一个糟糕的用户体验,因为他们需要遵循无论如何,再次链接进入表单页面。由于会话过期,我们收到了很多客户的投诉。</p>
<p>最好的方案是在 <code>FormController.php</code> 上创建某种函数,当用户进入表单页面或其他一些特定路由时,我们会执行类似 <code>session() 的操作->extendSessionInMinutes(360)</code>。我做了一些研究,但在 Laravel 文档(请注意我们使用的是 <code>Laravel 8.1</code>)或 Stackoverflow 上找不到类似的内容。本周阅读了有关此主题的很多内容,例如有关创建新中间件的解决方案,该中间件根据用户角色或类似内容提供不同的会话生命周期,但此选项对我们来说没有用。</p>
<p>我正在开发一个解决方案,该解决方案将使用类似的解决方案在会话上添加<strong>新变量</strong> <code>session()->put('time_to_logout', now()->addHours( 2))</code> 了解会话达到 2 小时的确切时间,因此我可以<strong>将 <code>SESSION_LIFETIME</code></strong> 的默认值的生命周期增加到 5 小时,并添加JS 函数每 30 分钟检查一次,是否需要注销并将用户重定向到注销页面,如果他在表单页面上,我们将停止检查。</p>
<p>但我认为这实际上不是一个好的解决方案,但我似乎无法考虑另一个解决方案。有没有办法通过以某种方式延长会话时间来完成我想要的事情?或者在不影响用户的情况下重新创建会话(<em>我敢打赌,这会弄乱表单上的 CSRF 令牌</em>),并且在他继续填写表单的同时,用 2 个小时以上的时间无缝地重新创建会话,没有注意到任何变化?</p>
<p>创建会话后,无法更改其过期时间吗?是否有某种 PHP 库可以帮助我,而无需更改太多 Laravel 默认会话相关功能?</p>
<p><em>提前感谢您的任何意见。</em></p>
是的,可以。并且您需要执行以下操作-
在
\Illuminate\Session\Middleware\StartSession::class,
之前添加\App\Http\Middleware\ChangeSessionValueDynamically::class,
。\App\Http\Middleware\ChangeSessionValueDynamically::class
的别名,如下所示 -