我们在Laravel 5.3中开发了一个网站,但只有IE / Edge浏览器提交表单有问题(TokenMismatchException)。
我尝试了一些方法来解决这个问题: TokenMismatchException in Edge and IE 11 with Laravel 5 App。 但是,Windows 10上的IE11 / Edge不再支持 P3P策略。 Reference
我发现问题是IE11 / Edge存储了具有相同键名(作为字符串)的重复cookie,尽管$ _COOKIE只为每个键存储一个(作为数组)。
例如,
$_SERVER['HTTP_COOKIE'] = "laravel_session=aaaaa; laravel_session=bbbb"
$_COOKIE = array('laravel_session' => 'aaaaa')
我使用了基本的网络中间件,例如
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
基本上,laravel请求尝试使用$ _COOKIE中的值,但有时它不是正确的。
在这种情况下,laravel无法解密该值(在EncryptCookies中间件中MAC发生无效错误),因此密钥的$ request-> cookie变为null,并且在VerifyCsrfToken中间件中抛出TokenMismatchException。
有没有人知道IE11 / Edge何时为同一个密钥存储重复的cookie,我们如何避免它? 我找不到发生问题的具体方法,但它经常发生在IE / Edge中。
以下是一些可能与此问题相关的参考资料: