【问题标题】:TokenMismatchException in Ajax post request in laravel with token passing带有令牌传递的laravel中的Ajax发布请求中的TokenMismatchException
【发布时间】:2017-07-11 13:09:23
【问题描述】:

我正在使用 ajax 提交表单数据,并且在传递令牌时收到此令牌不匹配错误。 这是我的代码 sn-p:

var _csrfToken = $('meta[name=token]').attr('content');
var link = $('meta[name=url]').attr('content');


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

$('#upload_form').submit(function(e)
{
    e.preventDefault();
    var title = $('#title').val();
    var designation = $('#position').val();
    var category = $('#category').val();
    var azimaData = {
        name: title,
        designation: designation,
        category: category,
         _token: _csrfToken
    };

    console.log(azimaData);

    $.ajax({
        method: 'POST',
        url: link + '/@dashboard@/galleryImage/add_image',
        data: azimaData,
        //use contentType, processData for sure.
        contentType: false,
        processData: false,

        success: function(msg) {

            if(msg.status == success)
            {
                alert(msg.msg);
            }
            else
            {
                alert(msg.msg);
            }
        },
        error: function(xhr) {

            console.log(xhr);
        }
    });

});

其他 Ajax 请求在令牌问题上运行良好。我在哪里做错了?

【问题讨论】:

  • 这是一个脚本标签吗?还是加载到另一个函数中?
  • @mbozwood 这是一个脚本标签。
  • 幽默,如果这是在刀片中,请将数据中的 _token 更改为 _token: '{{ csrf_token() }}'。让我知道这是否有效

标签: jquery ajax laravel


【解决方案1】:

在将 contentType 和 processData 选项设置为 false 后,您不能以对象形式发送数据。因此,在这种情况下,您可以通过序列化表单或创建新的 FormData 实例并手动将数据附加到其中来发送数据。

我已经编辑了您的代码。并已使用 FormData 与令牌一起发送数据。

    $('#upload_form').submit(function(e)
    {
        e.preventDefault();
        var title = $('#title').val();
        var designation = $('#position').val();
        var category = $('#category').val();
        var azimaData = new FormData(); // create a new FormData.. 
        azimaData.append('name', title);
        azimaData.append('designation', designation);
        azimaData.append('category', category);
        azimaData.append('_token', _csrfToken);

        $.ajax({
            method: 'POST',
            url: link + '/@dashboard@/galleryImage/add_image',
            data: azimaData,
            //use contentType, processData for sure.
            contentType: false,
            processData: false,

            success: function(msg) {

                if(msg.status == success)
                {
                    alert(msg.msg);
                }
                else
                {
                    alert(msg.msg);
                }
            },
            error: function(xhr) {

                console.log(xhr);
            }
        });

    });

【讨论】:

    【解决方案2】:

    通过从您的 ajax 请求中删除 contentType: falseprocessData:false 来尝试 ajax 请求。

    $.ajax({
        method: 'POST',
        url: link + '/@dashboard@/galleryImage/add_image',
        data: azimaData,
        success: function(msg) {
            if(msg.status == success) {
                alert(msg.msg);
            } else {
                alert(msg.msg);
            }
        },
        error: function(xhr) {
            console.log(xhr);
        }
    });
    

    jQuery AJAX documentation

    【讨论】:

    • @Azima 你能更新一下console.log(azimaData); 的样子吗?
    • 对象{名称:“Katell Wilcox”,名称:“Inventore sed dolorum expedita ut maxime adipisicing aut voluptatibus aperiam obcaecati vitae”,类别:“7”,_token:“69LPiaHojmwnaFdK1nRtW04Y2yCZl1G3MAgGfJtJ”} jquery.min。 js:4 POST localhost:8000/@dashboard@/galleryImage/add_image500(内部服务器错误)发送@jquery.min.js:4 ajax@jquery.min.js:4(匿名)@admin.js:27 调度@jquery.min.js:3 r .handle@jquery.min.js:3 jquery.min.js:2 Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType:
    • 对不起,我不知道如何评论图片
    • 您是否收到tokenMismatch 异常作为响应?
    • 是的..我已经多次检查令牌...在控制台中查看和在视图文件中打印时令牌是相同的
    【解决方案3】:

    更改您的meta name。应该是这样的

    var _csrfToken = $('meta[name=_token]').attr('content');
    

    【讨论】:

    • 元令牌的名称无关紧要。只要你引用它,它可以是任何东西。我在我的所有地方都使用csrf-token
    • 你得到了console.log(azimaData);中的所有数据
    • @ArigiWiratama no.. 它正在抛出令牌不匹配异常
    • 我不知道,我想我们必须先调试它:(。好吧,你确定你用{{ csrf_token() }}设置你的元内容
    • @ArigiWiratama 是的.. 它正在处理其他 ajax 请求
    猜你喜欢
    • 2014-12-28
    • 2014-03-04
    • 2016-05-08
    • 2018-01-10
    • 2016-12-01
    • 1970-01-01
    • 2016-10-12
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多