在VerifyCsrfToken.php第46行中,Laravel 5,ajax,500内部服务器错误,TokenMismatchException:

时间:2015-05-26 14:01:23

标签: php jquery ajax laravel laravel-5

我在弹出警报中使用带有ajax帖子的Laravel 5,它给我错误“500内部服务器错误”,当我检查firebug时,我发现ajax返回错误页面说“VerifyCsrfToken.php中的TokenMismatchException”第46行:“

当我评论App\Http\Middleware\VerifyCsrfToken时,它运行正常,但我认为不推荐,我打印_token变量并且它不是空的
ajax邮政编码是:

 $('#demo_4').click(function(){
        bootbox.prompt("What is your name?", function(result) {
            if (result === null) {
                alert("Prompt dismissed");
            } else {
                // alert("Hi <b>"+result+"</b>");
                $.ajax({
                    url: 'test',
                    type: "post",
                    data: {'name':result, '_token': $('input[name=_token]').val()},
                    success: function(data){
                        alert(data);
                    }
                });
            }
        });
    });

路线代码是:

Route::post('test', 'AccountController@login');

AccountController代码是:

<?php
namespace App\Http\Controllers;
use Input;
use Request;
use App\Http\Controllers;

class AccountController extends Controller 
{

    public function login()
    {

        if (Request::ajax()) {
            $data = Input::all();
            print_r($data);
            die;
        }

    }
}

2 个答案:

答案 0 :(得分:3)

您需要将此行插入表单

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

或者将其添加到控制器

use Illuminate\Support\Facades\Session

请启用调试器并提供Laravel5调试器显示的更多详细信息。

在ajax调用中将此添加到data选项:

'_token':$('input[name=_token]').val()

或以全球方式添加

<meta name="_token" content="{!! csrf_token() !!}"/>

并添加到页脚:

<script type="text/javascript">
    $.ajaxSetup({
        headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
    });
</script>

UPD:到控制器

use Input;
use Request;
class AccountController extends Controller {
    public function login() 
    {
    // Getting all post data
    if(Request::ajax()) {
        $data = Input::all();
        print_r($data);die;
    }
}

UPD2:尝试将其添加到主布局

<meta name="_token" content="{!! csrf_token() !!}"/>

<script type="text/javascript">
    $.ajaxSetup({
        headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
    });
</script>

检查您的Web服务器是否已具有对会话目录的写访问权限,它可以是app/storage/framework/sessions/。 执行

rm -f {your_web_app}/storage/framework/sessions/*

重新加载网络服务器。

在某些情况下,使用以下代码检查app/Http/Middleware/VerifyCsrfToken.php tokensMatch方法:

$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');

return $request->session()->token() == $token;

并检查javascript文件:

// CSRF protection
$.ajaxSetup(
{
    headers:
    {
        'X-CSRF-Token': $('input[name="_token"]').val()
    }
});

答案 1 :(得分:0)

我也遇到过类似的问题

替换     data: {'name':result, '_token': $('input[name=_token]').val()}, 同     data: {'name':result, '_token': "$('input[name=_token]').val()"},

在令牌周围放置双引号解决了我的问题。