laravel TokenMismatchException in ajax request

2022-08-30 15:30:03

我正在使用资源组并使用此筛选器来解决问题:TokenMismatchException

Route::filter('csrf', function($route, $request) {
    if (strtoupper($request -> getMethod()) === 'GET') {
        return;
        // get requests are not CSRF protected
    }

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

    if (Session::token() != $token) {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

我的路线 :

Route::group(array('prefix'=> 'admin', 'before' => 'csrf'), function(){
    Route::resource('profile' , 'ProfileController', array('as'=>'profile') );
});

现在。我得到错误到Ajax请求,如以下代码:

<script type="text/javascript">
    $(document).ready(function() {
       $('#frm').submit(function(e){
           e.preventDefault();
           name         = $('#name').val();
           family       = $('#family').val();
           email        = $('#email').val();
           currPassword = $('#currPassword').val();
           password     = $('#password').val();
           password_confirmation = $('#password_confirmation').val();     

           $.post("{{ route('admin.profile.update', $profile->id) }}",
                { 
                  _method : 'PUT',
                  name                  : name,
                  family                : family,
                  email                 : email,
                  currPassword          : currPassword,
                  password              : password,
                  password_confirmation : password_confirmation  
                },
                function(data)
                {
                    alert(data.errors.name);
                },'json');
                return false;
       });
});
</script>

错误:

{"error":{"type":"Illuminate\\Session\\TokenMismatchException","message":"","file":"\/var\/www\/alachiq\/app\/filters.php","line":83}}

我想我必须被发送_token。但是我不能得到带有属性的标签。iget 此错误:$.postinputname

TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.

答案 1

Laravel文档中有一个关于如何做到这一点的提示。在提出问题时,这可能不可用,但我想我会用答案更新它。

http://laravel.com/docs/master/routing#csrf-x-csrf-token

我已经从文档中测试了元标记方法并使其正常工作。将以下元标记添加到全局模板中

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

添加此 JavaScript,为 jQuery 中的所有 ajax 请求设置默认值。最好是在应用中包含的 js 文件中。

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

此令牌可以存在于请求标头或表单中。这会将其填充到每个 ajax 请求的请求标头中。


答案 2

您必须插入一个带有_token的隐藏输入,然后像获取ajax帖子中的其他表单字段一样获取该值。

<input type="hidden" name="_token" value="{{ csrf_token() }}" />

另一种方法,

在视图上,您可以使用_token

<script type="text/javascript">
    var _globalObj = {{ json_encode(array('_token'=> csrf_token())) }}
</script>

稍后在 ajax 调用中,您可以从对象获取_token,如下所示:

var token = _globalObj._token;

并将其包含在您的ajax帖子中。


推荐