我正在debian 7服务器上使用laravel 5.0,php 5.5开发一个Web应用程序。
该网站允许用户通过登录模式(ajax登录)登录。但...
我一直得到这个例外
TokenMismatchException in VerifyCsrfToken.php line 47
我知道有关csrf_token()的故事必须在表单中,而X-CSRF-TOKEN用于ajax帖子。我已经尝试了所有的东西,但仍然没有解决方案。
有趣的是,只有当您第一次访问该网站时,才会在主页或任何页面上直接访问该网站。当你访问一个成员区域时,laravel会将你的主页重定向到带有auth错误的主页,之后你再也不会得到tokenmismatchexception,同样的登录模式就像sun一样闪耀。任何建议
更新:
以下是代码:
在标题中的我已经包含了csrf_code():
<meta name="csrf-token" content="{{ csrf_token() }}">
并且在表单中(实际上是可选的,因为已经设置了X-CSRF-TOKEN)
<input type="hidden" name="_token" value="{{ csrf_token() }}">
路线:
Route::post('/login', ['as' => 'auth.login', 'uses' => 'Auth\AuthController@postSignin']);
VerifyCsrfToken.php进行调试。
public function handle($request, Closure $next)
{
if ($this->isReading($request) || $this->tokensMatch($request)) {
return $this->addCookieToResponse($request, $next($request));
}
throw new TokenMismatchException;
}
public function tokensMatch($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (!$token && $header = $request->header('X-XSRF-TOKEN')) {
$token = $this->encrypter->decrypt($header);
}
\Clockwork::info($request->session()->token());
//\Clockwork::info(\Session::token());
\Clockwork::info($token);
//return StringUtils::equals($request->session()->token(), $token);
return StringUtils::equals(\Session::token(), $token);
}
Jquery Ajax设置:
$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
答案 0 :(得分:2)
是最后修复,原因是因为网站开头有两个空白行。在我使用的内容刀片中
@extends('layouts/main')...@show
用于显示布局。 @show导致两个空白行,删除@show并且空白行消失。无论出于何种原因,打破了网站上的所有cookie,Laravel无法创建会话。
答案 1 :(得分:0)
你的所有代码都很顺利..
你可以试试这个......
$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
在调用jquery文件后移动此代码...
实际上当页面加载时,运行此代码后html dom加载。你应该这样做,你的代码应该在加载html dom之后运行。
我在我的网站上遇到了同样的问题。