【发布时间】: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 只是防止缓存。没有标题输出没有区别。