Laravel 站点异常 'Illuminate\Session\TokenMismatchException'

Posted

技术标签:

【中文标题】Laravel 站点异常 \'Illuminate\\Session\\TokenMismatchException\'【英文标题】:Laravel site exception 'Illuminate\Session\TokenMismatchException'Laravel 站点异常 'Illuminate\Session\TokenMismatchException' 【发布时间】:2016-06-22 21:08:53 【问题描述】:

Laravel 5.1

我偶尔会收到此错误,最常见的是登录 IE11,但有时也出现在 AJAX 调用中。我的登录表单中有适当的 csrf 字段,并且我还将它添加到 AjaxSetup 函数中。

我认为 ajax 会发生这种情况,因为用户会在一段时间后返回页面并在会话过期后尝试使用某个功能。

IE11 问题让我很困惑,因为他们已经注销了。

    如何在会话过期后使用 ajax 函数时自动重定向到登录?

    如何防止 IE11 在尝试登录时生成此错误?

.

Error of type ERROR [03/02/2016 11:06 am]: exception 'Illuminate\Session\TokenMismatchException' on page /var/www/vendor/bootstrap/cache/compiled.php
Stack trace:
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#2 /var/www/vendor/bootstrap/cache/compiled.php(12961): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#4 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#5 /var/www/vendor/bootstrap/cache/compiled.php(11555): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#7 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#8 /var/www/vendor/bootstrap/cache/compiled.php(12698): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#11 /var/www/vendor/bootstrap/cache/compiled.php(12635): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#13 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#14 /var/www/vendor/bootstrap/cache/compiled.php(2982): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 /var/www/vendor/bootstrap/cache/compiled.php(9585): call_user_func_array(Array, Array)
#17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#18 /var/www/vendor/bootstrap/cache/compiled.php(9575): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#19 /var/www/vendor/bootstrap/cache/compiled.php(2254): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#20 /var/www/vendor/bootstrap/cache/compiled.php(2237): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#21 /var/www/vendor/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#22 main

【问题讨论】:

【参考方案1】:

您的 ajax 请求和表单帖子缺少 CSRF 令牌。确保在 web 组中间件下包含令牌或所有路由。

您可以在标题中创建元标记来实现此目的。

<meta name="csrf-token" content=" csrf_token() "/>

并将此令牌包含在您的 ajax 调用中。 (您的 ajax 请求可能看起来不同,但数据中应该包含 _token。)

var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');

$.ajax(
   type: "POST",
   data: _token: CSRF_TOKEN, data:data,
   dataType: 'JSON',
   url: "/check",
   success: function(msg) 
         //something...  
   ); 
); 

对于表单帖子,您可以在表单中包含以下代码。

csrf_field()

【讨论】:

我脑子里有这个&lt;meta name="_token" content=" csrf_token() "/&gt;我会试着改名字 这应该没有什么不同,因为$.ajaxSetup 函数也使用了名称_token 只要名称匹配就没有关系。您是否检查过表格以确保它们具有令牌字段? 是的,登录和注册表单已添加该字段。我应该提到我在 Firefox 和 Chrome 上遇到了几乎 0 个问题。它主要在 IE11 中。 几乎 0 个问题听起来不正确。应该是0个问题。你能发布一些代码吗?例如让您注销的视图?

以上是关于Laravel 站点异常 'Illuminate\Session\TokenMismatchException'的主要内容,如果未能解决你的问题,请参考以下文章

在 vendor\laravel\framework\src\Illuminate\Container\Container.php 中未捕获的异常 'ReflectionException' 和消息

Laravel 流明反射异常

Laravel [登录消息] 未找到异常

Laravel 绑定解析异常。目标类不存在[重复]

照亮\数据库\查询异常 SQLSTATE [42000]

Laravel 5 未找到类“Illuminate\Html\HtmlServiceProvider”