Laravel 5.4 令牌不匹配异常 (Chrome)
Laravel 5.4 TokenMismatchException (Chrome)
我在 POST 路线中遇到 Laravel 5.4 问题。
提交表单时,出现TokenMismatchException错误。
我认为这是关于 PrefixVariable 的,所以我在 Github 上打开了 this issue。但是经过多次测试并尝试了不同的解决方案后,我发现问题不是由 Prefix 造成的。
Firefox 一切正常,主要问题出在chrome。 Post 路由只工作一次,在提交第一个表单后,所有对同一个 URL 的下一个请求都会面临 TokenMismatchException 错误。
我试过以下方法:
- 正在清除 Chrome cookie 和历史记录
- 运行
php artisan cache:clear
命令
- 更改服务端口
- 使用 headers
在 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";
}
}
请参考这个link.May,它会对你有所帮助。
告诉我一件事,您是否检查过安装时提供的默认 laravel app.blade.php 下面代码的布局文件。
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
window.Laravel = {!! json_encode([
'csrfToken' => csrf_token(),
]) !!};
</script>
我找到解决办法了!
我之前试图从设置中的历史记录中清除 cookie。我从 Inspect Element > Application Tab > Storage (Left side) > Cookies > localhost:port
中删除了 XSRF-TOKEN
cookie,之后一切正常。
这不是 laravel 的问题,而是 chrome 的问题。
因为 chrome 不为本地主机保存 cookie (reference) 所以 laravel 无法保存会话 ID,这就是为什么不能' t 加载创建的会话。所以它正在再生。
为了测试这个问题,您可以删除所有存储的会话并重新加载您的页面。如果在会话存储文件夹中创建了两个会话文件,那么这就是适合您的解决方案。
解决方案:
使用 127.0.0.1 ip 而不是本地主机。
这对我有用。测试一下!
我在 POST 路线中遇到 Laravel 5.4 问题。
提交表单时,出现TokenMismatchException错误。
我认为这是关于 PrefixVariable 的,所以我在 Github 上打开了 this issue。但是经过多次测试并尝试了不同的解决方案后,我发现问题不是由 Prefix 造成的。
Firefox 一切正常,主要问题出在chrome。 Post 路由只工作一次,在提交第一个表单后,所有对同一个 URL 的下一个请求都会面临 TokenMismatchException 错误。
我试过以下方法:
- 正在清除 Chrome cookie 和历史记录
- 运行
php artisan cache:clear
命令 - 更改服务端口
- 使用 headers 在 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";
}
}
请参考这个link.May,它会对你有所帮助。
告诉我一件事,您是否检查过安装时提供的默认 laravel app.blade.php 下面代码的布局文件。
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
window.Laravel = {!! json_encode([
'csrfToken' => csrf_token(),
]) !!};
</script>
我找到解决办法了!
我之前试图从设置中的历史记录中清除 cookie。我从 Inspect Element > Application Tab > Storage (Left side) > Cookies > localhost:port
中删除了 XSRF-TOKEN
cookie,之后一切正常。
这不是 laravel 的问题,而是 chrome 的问题。
因为 chrome 不为本地主机保存 cookie (reference) 所以 laravel 无法保存会话 ID,这就是为什么不能' t 加载创建的会话。所以它正在再生。
为了测试这个问题,您可以删除所有存储的会话并重新加载您的页面。如果在会话存储文件夹中创建了两个会话文件,那么这就是适合您的解决方案。
解决方案:
使用 127.0.0.1 ip 而不是本地主机。
这对我有用。测试一下!