2017-04-25 144 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的而不是本地主機。

這是爲我工作。測試它!