[英]Laravel session id changes with each request
我有一个 Laravel 5.0 站点,其中前端 JS 对后端 Laravel 代码进行了很多 ajax 调用。 我注意到在每个 ajax 请求中,我每次都会在响应中获得一个新的“laravel_session”cookie 值。 我猜这是一些防止 session 劫持的安全机制。
但是我认为这会导致我的网站出现问题,因为我的 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 - 响应 - session 不再有效
有没有办法解决?
我还应该注意,会话在 config/session.php 中设置为“生命周期”=> 120,
你是对的,它是一种安全机制。 要禁用它以进行测试,请在 Kernel.php 中注释掉这一行:
\App\Http\Middleware\EncryptCookies::class
然后您将在 cookie 查看器中看到会话 ID,并且它不会更改。
您可以通过 Google for HTTP 加密 cookie 来了解这种做法。 既然我们在每个网站上都使用 HTTPS,是否有必要使用这种旧做法仍然存在争议。
您的域无效。 您需要查看config.session.domain
和config.session.path
。
同样的问题发生在我身上,后来发现我正在使用
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。
我有同样的问题,我尝试了很多解决方案,但对我没有任何效果。
我的情况:只有当会话驱动程序设置为database
时,令牌才会在每个请求中不断变化,并且它在file
和Redis
驱动程序上工作得很好。
经过大量调试,我发现问题不在于会话配置,而是来自数据库中会话表中的payload
列。
我将payload
列从 text 更改为longText
,它起作用了!
关于会话有一些重要的事情。 首先是饼干时间。 如果您的 Laravel 应用程序的时区是 UTC,但您计算机的时区是 +3,那么如果您将 cookie 生命周期设置为 120(两小时),那么浏览器将立即删除 cookie。 您必须延长 cookie 的寿命。
其他选项是加密。 Cookies 始终是加密的。 如果在sessions.php
文件storage/framework/sessions
文件夹中设置encrypt=true
,将被加密。 有时这会导致问题。 如果 session 不保留,则尝试将encrypt
设置为false
。 之后,您可以看到 session 文件未加密并且具有“序列化”文本。 然后你可以在那里看到你的 session 变量。
其他选项是sessions.php
文件中的domain
变量。 您必须正确设置它或保留它null
。 域首先不能有http(s)://
。 仅在其中写入域(例如 yourdomain.com、yourdomain.test、yourdomain.host、 www.yourdomain.com 、subdomain.yourdomain.com 等...)
其他选项是关于driver
。 如果将其设置为database
,则必须确保表列有足够的大小来存储大 session 数据。 如果将其设置为file
,则必须确保storage/framework/sessions
文件夹是可写和可读的。
还有一个“小”(我认为很重要)的把戏。 不要在 session 中使用通用关键字。 例如,不要使用“令牌”键。 使用 session 的特定名称。 这是错误的: session(['token' => $result->token])
,但这更好: session(['backend_remote_token' => $result->token])
摇滚乐...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.