使用Yii 2获取有关Ajax调用的错误请求(#400)

 安小辰 发布于 2022-12-09 17:39

这是我的代码:

$(document).on('change', '#tblhotel-int_zone_id', function(e){
    var zoneId = $(this).val();
    var form_data = {
        zone: zoneId
    };
    $.ajax({
        url: "state",
        type: "POST",
        data: form_data,
        success: function(response)
        {
            alert(response);
        }
    });
});

由此可见:

错误请求(#400):无法验证您的数据提交.

我已经有了.我该如何解决这个问题?

4 个回答
  • 使用:

    var csrfToken = $('meta[name="csrf-token"]').attr("content");
    $.ajax({
        url: 'request',
        type: 'post',
        dataType: 'json',
        data: {param1: param1, _csrf : csrfToken},
    });
    

    更多细节:Yii2:使用csrf令牌

    2022-12-11 02:09 回答
  • 注意:请参阅Skullcrasher的答案,以正确的方式解决问题,因为我的答案建议禁用跨站点请求伪造.


    你有enableCsrfValidation的问题.要了解更多信息,请阅读此处.

    要禁用CSRF,请将此代码添加到控制器:

    public function beforeAction($action) {
        $this->enableCsrfValidation = false;
        return parent::beforeAction($action);
    }
    

    这将禁用所有操作.您可能应该根据$操作仅为特定操作禁用它.

    2022-12-11 02:09 回答
  • 在布局的底部添加此代码:

    <script>
        $.ajaxSetup({
            data: <?= \yii\helpers\Json::encode([
                \yii::$app->request->csrfParam => \yii::$app->request->csrfToken,
            ]) ?>
        });
    </script>
    

    2022-12-11 02:58 回答
  • 正如Mihai P.所说,你的问题是CSRF验证.您也可以禁用行为验证,但这不是一个好的解决方案.

    由于您的Ajax请求中存在验证问题,您还可以使用Yii JavaScript函数将CSRF令牌添加到您在Ajax请求中发送的formdata.

    只需尝试将令牌添加到表单数据中,如下所示:

    var form_data = {
        zone: zoneId,
        _csrf: yii.getCsrfToken()
    };
    

    我希望这有帮助,因此您不必禁用CSRF验证.

    除了手动添加CSRF令牌之外,您还可以检查请求中是否设置了X-CSRF头.

    2022-12-11 03:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有