即使包含CSRF令牌,Laravel ajax帖子也无法正常工作

时间:2017-12-21 04:31:32

标签: ajax laravel post csrf

我很难获得一个ajax帖子与laravel v5.5.24一起使用。这是我的ajax调用的样子:

var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
$.ajax({
    url: "/postCustomer?XDEBUG_SESSION_START=19683",
    type: 'POST',
    data: {_token: CSRF_TOKEN, message:myData, "_method": 'POST'},
    dataType: 'JSON',
    success: function (data) {
        console.log('call to postCustomer successful');
    }
});

这是我的路线:

Route::post('/postCustomer','AdminUserController@store');

关于这个问题的有趣之处在于,当所有帖子都被改为get(在ajax调用和路由中)时,请求到达并正确处理。调试被触发,一切都很顺利。但是,如果将路由和ajax调用设置为POST,则永远不会触发调试,并且请求似乎没有成功。当然,这有点像CRSF问题,但我在头文件中包含了CRSF令牌。

4 个答案:

答案 0 :(得分:0)

如果.blade.php文件中的javascript代码试试这个

 data: {_token:'{{ csrf_field() }}', message:myData, "_method": 'POST'},

希望得到帮助

答案 1 :(得分:0)

试试这个, <meta name="_token" content="{!! csrf_token() !!}"/>

$.ajaxSetup({
        headers:
            {'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')}
    });
$.ajax({
    url: "/postCustomer?XDEBUG_SESSION_START=19683",
    type: 'POST',
    data: {message:myData, "_method": 'POST'},
    dataType: 'JSON',
    success: function (data) {
        console.log('call to postCustomer successful');
    }});

无需再次在ajax数据中传递令牌。

答案 2 :(得分:0)

衷心感谢所有回复的人。有几件事情帮助我解决这个问题。首先,我整合了CSRF令牌提及, 并限制我作为数据发送的内容 - 如果你在ajaxSetup中执行它,则不需要在数据中包含CSRF令牌。第二件事从我的帖子中看不到,但是我遇到了涉及触发ajax事务的按钮的竞争条件。该按钮导致页面重新加载之前,ajax可以做到这一点,这就是为什么偶尔会出现这种情况,但大多数情况下都不行。所以返回false是必要的,以防止 - 可能不是在两个地方,但肯定在调用ajax事务后我们正在等待回调。有效的代码可以在下面找到。我希望这会阻止别人花一夜疯狂试图弄清楚他们的POST不起作用。拿走积分:在ajaxSetup调用中处理你的CSRF,并从整个业务中返回false。

再次感谢大家。

-George Pipkin 弗吉尼亚州阿夫顿

                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    }
                });
                $.ajax({
                    /* the route pointing to the post function */
                    url: "/postCustomer?XDEBUG_SESSION_START=19159",
                    type: 'POST',
                    /* send the csrf-token and the input to the controller */
                    data: {message:myData},
                    dataType: 'json',
                    /* remind that 'data' is the response of the AjaxController */
                    success: function (data) {
                        $("#success_msg").show();
                        return false;
                    }
                });
                return false;

答案 3 :(得分:0)

您必须在数据对象内部传递_token。

data: {_token:'{{ csrf_token() }}',, message:myData, "_method": 'POST'},