【问题标题】:Laravel 5.4 TokenMismatchException (Chrome)Laravel 5.4 TokenMismatchException (Chrome)
【发布时间】:2017-09-22 07:30:27
【问题描述】:

我在 POST 路由中遇到了 Laravel 5.4 的问题。

表单提交时,出现错误TokenMismatchException。

我以为是关于 PrefixVariable 所以我在 Github 上打开了this issue。但是经过大量测试并尝试了不同的解决方案后,我发现问题不是由 Prefix 引起的。

在 Firefox 中一切正常,主要问题出现在 chrome 中。 Post 路由只工作一次,在提交第一个表单后,所有对同一 URL 的下一个请求都面临 TokenMismatchException 错误。

我尝试了以下方法:

  • 清除 Chrome cookie 和历史记录
  • 运行php artisan cache:clear 命令
  • 更改服务端口
  • 在 PHP 中使用标头防止缓存
  • 使用元标记防止在 HTML 中缓存

但问题依然存在。

到底怎么了?!如果您能帮助我,我们将不胜感激。

登录表格:

<form method="post" action="{{route('login')}}">
    {!! csrf_field() !!}
    <div class="row">
        <div class="col-xs-12">
            <div class="form-group no-margin">
                <div class="col-xs-6 col-md-10 col-md-offset-1">
                    <input name="username" type="text" class="form-control" placeholder="نام کاربری" value="{{old('username')}}">
                </div>
            </div>
            <div class="form-group no-margin">
                <div class="col-xs-6 col-md-10 col-md-offset-1">
                    <input name="password" type="password" class="form-control" placeholder="کلمه عبور">
                </div>
            </div>
        </div>
        <div class="col-xs-12">

            <div class="form-group no-margin">
                <div class="col-xs-5 col-md-offset-1">
                    <input name="captcha" type="text" class="form-control" placeholder="کپچا">
                </div>
                <div class="col-xs-5 no-pad-right">
                    <img src="{{captcha_src('flat')}}" class="img-responsive">
                </div>
            </div>
        </div>
        <div class="col-xs-12 text-center">
            <div class="form-group">
                <button type="submit" class="btn btn-success btn-raised">ورود<div class="ripple-container"></div></button>
                <button type="reset" class="btn btn-danger btn-raised">انصراف<div class="ripple-container"></div></button>
            </div>
        </div>
    </div>
</form>

web.php

Route::group(['prefix' => config('system.ADMIN_PATH'), 'namespace' => 'Panel'], function(){
    Route::get('/', function(){return redirect()->route('login');});
    Route::get('/auth', 'AuthController@Login')->name('login');
    Route::post('/auth', 'AuthController@Auth')->name('check');
});

AuthController.php:

namespace App\Http\Controllers\Panel;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class AuthController extends Controller
{
    public function Login(Request $request)
    {
        header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");

        return view('admin.login');
    }

    public function Auth(Request $request)
    {
        header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
        dump($request->all());
        echo "Received";
    }
}

【问题讨论】:

  • 这些标题的用途是什么?
  • @TobyMellor 只是防止缓存。没有标题输出没有区别。

标签: php laravel csrf


【解决方案1】:

这不是 laravel 的问题,是 chrome 的问题。

因为 chrome 不会为 localhost 保存 cookie (reference),所以 laravel 无法保存会话 id,这就是为什么无法加载创建的会话的原因。所以它正在再生

为了测试这个问题,您可以删除所有 storaged session 并重新加载您的页面。如果在会话存储文件夹中创建了两个会话文件,那么这就是您的解决方案。

解决方案

使用 127.0.0.1 ip 而不是 localhost。

这对我有用。测试一下!

【讨论】:

  • @اسماعيل زارع 谢谢
【解决方案2】:

请参考此链接。可能会对您有所帮助。

https://github.com/laravel/framework/issues/15040

【讨论】:

    【解决方案3】:

    告诉我一件事,您是否检查了带有以下代码的布局文件,因为安装时默认 laravel app.blade.php 已提供。

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">
    
    
    <script>
        window.Laravel = {!! json_encode([
            'csrfToken' => csrf_token(),
        ]) !!};
    </script>
    

    【讨论】:

    • 我没有使用 Ajax。这只是一个简单的表单提交。我认为问题与 Chrome 设置有关,因为代码在 Firefox 中运行良好。
    • 是的,我也是。它适用于 firefox,而不适用于 chrome @Erfun
    • @GetWiz 尝试从应用程序选项卡中清除您的 chrome 缓存。
    【解决方案4】:

    我想出了解决办法!

    我之前试图从“设置”中的“历史记录”中清除 cookie。我从Inspect Element &gt; Application Tab &gt; Storage (Left side) &gt; Cookies &gt; localhost:port中删除了XSRF-TOKEN cookie,之后一切都很好。

    【讨论】:

      猜你喜欢
      • 2017-11-21
      • 2023-03-28
      • 2018-07-11
      • 2019-03-14
      • 2017-07-29
      • 1970-01-01
      • 2018-07-28
      • 2018-01-02
      • 2015-10-04
      相关资源
      最近更新 更多