2017-04-25 124 views
0

我在POST路由中遇到Laravel 5.4的问题。Laravel 5.4 TokenMismatchException(Chrome)

当提交表单时,显示错误TokenMismatchException。

我认为这是关于PrefixVariable,所以我在Github上打开了this issue。但经过太多的测试并尝试不同的解决方案后,我发现问题不是由Prefix制定的。

Firefox中的所有内容都正常,主要问题出现在Chrome中。邮局路由仅在提交第一个表单后,所有接下来的请求到同一个URL表面TokenMismatchException错误。

我已经试过如下:

  • 清除浏览器cookies和历史记录
  • 运行php artisan cache:clear命令
  • 更改即成端口
  • 防止缓存PHP中的头
  • 防止缓存在HTML与Meta Tags

但问题依然存在。

究竟是什么错误?如果你能帮助我,我将不胜感激。

登录表单:

<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', '[email protected]')->name('login'); 
    Route::post('/auth', '[email protected]')->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"; 
    } 
} 
+0

这些标题的目的是什么? –

+0

@TobyMellor只是防止缓存。没有标题的输出没有区别。 –

回答

0

我想出了什么是解决方案!

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

0

告诉我一件事你检查布局文件与下面的代码作为默认laravel app.blade.php在安装时提供。

<!-- CSRF Token --> 
<meta name="csrf-token" content="{{ csrf_token() }}"> 


<script> 
    window.Laravel = {!! json_encode([ 
     'csrfToken' => csrf_token(), 
    ]) !!}; 
</script> 
+0

我没有使用Ajax。这只是一个简单的表单提交。我认为问题与Chrome设置有关,因为代码在Firefox中运行良好。 –

0

这不是laravel的问题,它与铬合金有关。

因为铬不保存cookiereference)对于localhost所以laravel不能保存会话ID,这就是为什么无法加载创建的会话。所以它是再生

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

soloution

使用127.0.0.1 IP的而不是本地主机。

这是为我工作。测试它!