TokenMismatchException Laravel 5& BackboneJs

时间:2015-03-06 20:43:20

标签: ajax laravel backbone.js laravel-5 laravel-routing

我正在开发一个Laravel 5-BackboneJs应用程序。我使用RESTful Resource控制器制作自己的API。

我有一个Backbone模型,然后我调用了save model方法。它产生了一个像这样的ajax请求:

gerencia.app/es/customrole/1

这就是为什么我尝试更新ID为1的模型。

Backbone使用PUT方法创建请求:

Request Information

但是它给了我500个内部服务器错误!我看到预览了:

Request preview

这是来自Laravel的TokenMismatchException,然后我发现我必须发送一个令牌,所以我在我的刀片视图中这样做了:

<meta name="token" content="{{ Session::token() }}">

然后我创建了一个设置令牌的函数,并将此函数添加到ajax beforeSend方法中:

function sendAuth( request ){

    console.log( request );

    return request.setRequestHeader("X-CSRF-Token", $("meta[name='token']").attr('content'));

}

model.save({
    beforeSend: sendAuth,
    success: function(){
        console.log( 'success!' );
    },
    error: function(){
        console.log( 'error!' );
    }
});

但是,尽管我在请求标题中看到了令牌,但它仍无法正常工作:(

request headers

任何帮助?

2 个答案:

答案 0 :(得分:2)

我可以按照Laravel网站上的说明进行操作。我将其添加到我的全局布局文件中:

<meta name="csrf-token" content="{{ csrf_token() }}" />

然后,我创建了一个名为csrf-token.js的JS文件,并将此代码放入其中:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

执行此操作后,Backbone的POST请求正常工作,我可以在请求中看到额外的标头。对我而言,关键是在Backbone之后加入csrf-token.js文件:

<script src="{{ asset('js/lib/backbone-min.js') }}"></script>
<script src="{{ asset('js/csrf-token.js') }}"></script>

我猜Backbone在加载时会覆盖ajax设置选项,因此您需要在此之后包含更改。

答案 1 :(得分:1)

我的解决方案是在我的模型方法中添加一个名为token的新键/值:

model.save({
    "_token" : $("meta[name='token']").attr('content'),
    success: function(){
        console.log( 'success!' );
    },
    error: function(){
        console.log( 'error!' );
    }
});

您可以针对此问题发布另一种解决方案。