Laravel之SESSION_DRIVER引发的TokenMismatchException

5deaad4fe742555db6c2fc76eb5a11e1

说在最前面
今天再做一个以Laravel为框架的系统做测试的时候,突然发现一个提交报错,结果报

Illuminate\Session\TokenMismatchException

通常这个很容易就猜到是没有通过Laravel的VerifyCsrfToken(有关Laravel CSRF可以看我的Laravel之CSRF)的tokensMatch(),但是突然报这个错也是挺无奈的,所以只好去解决。

以下是解决这个问题的心路历程:

直接定位到tokensMatch()
打开Illuminate\Foundation\Http\Middleware\VerifyCsrfToken类,定位到tokensMatch(),打印出$sessionToken和$token什么情况

protected function tokensMatch($request)
{
    $sessionToken = $request->session()->token();
var_dump($sessionToken);
    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
var_dump($token);
exit;
    if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
        $token = $this->encrypter->decrypt($header);
    }

    if (! is_string($sessionToken) || ! is_string($token)) {
        return false;
    }

    return hash_equals($sessionToken, $token);
}

结果就是不相等的两个字符串,这回就有点蒙了,虽然也在情理之中,然而Google了半天还是没有什么头绪,然而这时突然看到有个答案是让看一下config/session.php文件

SESSION的配置有问题?
开始浏览session.php,突然cookie这个配置让我提起了兴趣

'cookie' => 'laravel_session',

说来也巧,这时我正好开着chrome控制台,结果发现cookie中并不存在这个laravel_session。

Laravel为什么没有给我生成这个cookie呢?
此时突然想起来前几天为了方便开发所以改了dev环境的配置,将配置中的CACHE_DRIVER设置成了array,当时就是想方便开发,结果当时碰巧也把SESSION_DRIVER也设置成了array,结果导致Laravel没有为我生成这个cookie,导致突然报了Illuminate\Session\TokenMismatchException这个错。

哈哈,配置不要乱改噢~

Laravel之SESSION_DRIVER引发的TokenMismatchException

发表评论

电子邮件地址不会被公开。 必填项已用*标注