本文作者:心月

YII2中ajax通过post提交form表单数据报400错误的解决方法

心月IT博客 2019-03-19
YII2中ajax通过post提交form表单数据报400错误的解决方法摘要:YII2中通过ajax post表单数据需要验证CSRF否则post数据是无法提交过去的。虽然有其他人提供过解决方案,但都不够完整,除了把enableCsrfValidation设为false外,其他的方法都有不小的问题。这里就给大家分享完整的ajax post提交表单数据验证不通过的解决方法。

YII2中通过ajax post表单数据需要验证CSRF否则post数据是无法提交过去的。虽然有其他人提供过解决方案,但都不够完整,除了把enableCsrfValidation设为false外,其他的方法都有不小的问题。这里就给大家分享完整的ajax post提交表单数据验证不通过的解决方法。

1、把enableCsrfValidation设为false

这种方法的目的是关闭csrf验证,出于安全考虑不建议关闭,因为一旦关闭控制器中的其他需要验证csrf的地方也不会验证了。

//给控制器类添加属性
public $enableCsrfValidation = false;

或者初始化控制器的时候设置

public function init(){
    $this->enableCsrfValidation = false;
}

2、把ajax中的post提交数据改为get提交,同时控制器中的行为过滤控制和数据接收也都改为get.这样的话就不会影响到其他行为的csrf验证了,不过表单数据的提交同样不建议用get.

1.jpg

3、在ajax的提交数据中把csrf验证一起提交过去,虽然网上有这个解决方法,但并不全面,遗漏了一个非常重要的参数配置,request提交验证配置

//前台配置
'request' => [
    'csrfParam' => '_csrf-frontend',
],

//后台配置
'request' => [
    'csrfParam' => '_csrf-backend',
],

csrf验证参数配置

虽然都是csrf验证,但前台和后台的csrf验证参数是不一样的。所以在ajax中添加提交数据的时候也是不一样的,前台提交数据验证应该用'_csrf-frontend':csrfToken

ajax中crsf验证数据

    如果是后台则要用'_csrf-backend':csrfToken,前提是没有修改前后台request配置。修改了就用修改后的值,只要保持ajax和配置中的验证字段一致即可。

    至于是添加隐藏域还是直接在ajax中获取csrfToken都无所谓,最终的目的都是通过ajax把csrfToken post给控制器。

以上就是本文提供的ajax post数据时数据无法验证 提示400错误的解决方法。

文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-03-19
若转载请注明原文及出处:https://www.xinyueseo.com/yii/201.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论