我将 Symfony 应用程序从 Symfony 4.0.7 升级到 Symfony 4.1,之后 AJAX 调用会丢失会话值。
我同时调用了大约 6 个 ajax 请求。第一个进展顺利,但其他人正在失去会话值。它仅在迁移到 Symfony 4.1 后发生,并且仅适用于 AJAX 调用。有任何想法吗?
编辑:它只发生在同时调用ajax的情况下。当我在调用 ajax 之间添加例如 100 毫秒的延迟时,一切正常。
edit2:它发生在4个不同的服务器上。 2 台开发服务器、1 台测试服务器和 1 台实时服务器。它们都运行在 NGINX 和 php7 上
可能的原因如下::
允许缓存使用会话的请求:
每当在请求期间启动会话时,Symfony 都会将响应转换为私有的不可缓存响应,以防止泄露私有信息。然而,在某些情况下,即使使用会话的请求也可以被缓存。
例如,可以为属于该组的所有用户缓存与某个用户组相关的信息。处理这些高级缓存场景超出了 Symfony 的范围,但可以使用 FOSHttpCacheBundle 来解决。
为了禁用默认的 Symfony 行为(使使用会话的请求不可缓存),在 Symfony 4.1 中,我们添加了 NO_AUTO_CACHE_CONTROL_HEADER 标头,您可以将其添加到响应中:
use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
$response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');
弃用 Request::getSession() 的某些用法
Symfony 4.1 中不推荐在不存在会话时使用 Request::getSession() ,并且在 Symfony 5.0 中它将引发异常。解决方案是始终首先使用 Request::hasSession() 方法检查会话是否存在:
if ($request->hasSession() && ($session = $request->getSession())) {
$session->set('some_key', 'some_value');
}
更多关于参考:Here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)