Laravel 会话 ID 随每个请求而变化

Posted

技术标签:

【中文标题】Laravel 会话 ID 随每个请求而变化【英文标题】:Laravel session id changes with each request 【发布时间】:2016-01-12 20:40:23 【问题描述】:

我有一个 Laravel 5.0 站点,其中前端 JS 对后端 Laravel 代码进行大量 ajax 调用。我注意到,在每个 ajax 请求中,我每次都会在响应中获得一个新的“laravel_session”cookie 值。我猜这是一些防止会话劫持的安全机制。

但是我认为这会导致我的网站出现问题,因为我的 ajax 调用经常并行发生,而不是顺序发生。在触发下一个呼叫之前,我不会等待响应。

考虑这种情况

。 Ajax 调用 1 - 请求 - laravel_session cookie = '1234'

。 Ajax 调用 1 - 响应 - laravel_session cookie = '2345'

。 Ajax 调用 2 - request- laravel_session cookie = '2345'

。 Ajax 调用 3 - request- laravel_session cookie = '2345'

。 Ajax 调用 2 - 响应 - laravel_session cookie = '3456'

。 Ajax 调用 3 - 响应 - 会话不再有效

有没有办法解决这个问题?

我还应该注意会话在 config/session.php 中设置为过期 '终生' => 120,

【问题讨论】:

这不是一种安全机制,你是对的 - 它不应该发生。检查config/session.php 中的会话设置,并检查cookie 路径是否有效。默认情况下,基于文件的会话应存储在 storage/framework/sessions/ - 如果该文件夹为空,那么您的安装可能无法正确写入该文件夹。 我在 config/session.php 中的设置对我来说看起来不错 'files' => storage_path().'/framework/sessions',我可以看到文件正在 storage/framework/sessions/ 中创建 对我来说是 'files' => storage_path('framework/sessions') 【参考方案1】:

你说得对,它是一种安全机制。要禁用它进行测试,请在 Kernel.php 中注释掉这一行:

\App\Http\Middleware\EncryptCookies::class

然后您将在 cookie 查看器中看到会话 ID,它不会改变。

您可以通过 Google 搜索 HTTP 加密 cookie 来了解这种做法。既然我们在每个网站上都使用 HTTPS,是否有必要使用这种旧做法仍然存在争议。

【讨论】:

你为什么这么说?这不是真的,您是在建议某人禁用安全机制。 我赞成这个。问题归结为,“为什么会发生这种情况?安全问题?”我相信这回答了它。您可以注释掉该行以进行验证,但我不认为这是删除加密的建议。 谢谢,我编辑了答案以澄清禁用以进行测试。【参考方案2】:

您的域无效。您需要查看config.session.domainconfig.session.path

【讨论】:

我已将 config/session.php 中的“域”设置更改为我网站的域,但仍然存在问题。 'path' 设置为 '/' 这对我来说似乎很好 您确定域是正确的吗?可以再发一张截图吗?几个小时以来我一直遇到同样的问题,直到我意识到我不小心犯了一个小错误。 我已经添加了截图。 local.mysite.com 是本地运行时站点的 url。我有一个主机条目。 我遇到了这个错误,是的,域不正确。我必须死。刚刚失去了我生命中的 4 个小时。 -_-【参考方案3】:

同样的问题发生在我身上,后来发现是我在使用

protected $middleware = [
     \Illuminate\Session\Middleware\StartSession::class,
     \Illuminate\View\Middleware\ShareErrorsFromSession::class
];
protected $middlewareGroups = [
     'web' => [
          \Illuminate\Session\Middleware\StartSession::class,
          \Illuminate\View\Middleware\ShareErrorsFromSession::class
     ]
]

在 $middleware 和 $middlewaregroups 中,它正在创建一个在不同路由之间移动的新会话 ID。

【讨论】:

以上是关于Laravel 会话 ID 随每个请求而变化的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:数据不会随变化而更新

PHP Session ID / Session 变量值随着来自 react axios / ajax 调用的每个请求而变化

Laravel的请求声明周期

如何在 laravel 中进行会话?

不同的会话驱动程序取决于 Laravel 中的路线

Laravel 为每个请求创建一个新会话