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.
3、在ajax的提交数据中把csrf验证一起提交过去,虽然网上有这个解决方法,但并不全面,遗漏了一个非常重要的参数配置,request提交验证配置
//前台配置 'request' => [ 'csrfParam' => '_csrf-frontend', ], //后台配置 'request' => [ 'csrfParam' => '_csrf-backend', ],
虽然都是csrf验证,但前台和后台的csrf验证参数是不一样的。所以在ajax中添加提交数据的时候也是不一样的,前台提交数据验证应该用'_csrf-frontend':csrfToken
如果是后台则要用'_csrf-backend':csrfToken,前提是没有修改前后台request配置。修改了就用修改后的值,只要保持ajax和配置中的验证字段一致即可。
至于是添加隐藏域还是直接在ajax中获取csrfToken都无所谓,最终的目的都是通过ajax把csrfToken post给控制器。
以上就是本文提供的ajax post数据时数据无法验证 提示400错误的解决方法。