无来

不管你来还是不来
我都在这里,夜夜点亮
不是为了守候
只是为了做好我自己

0%

Yii2 ajax错误请求(#400)

yii ajax post 请求出现400错误,如下:

Bad Request (#400): Unable to verify your data submission.

或者

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

整个页面所有ajax请求都出现错误,在ajax请求的header里面包含了_csrf信息,由于使用了yii2-sortable-grid-view-widget控件,所以无法通过ajax添加csrf来处理。

在网上总结了一下方法,将所有方法列出如下:

1、禁用csrf验证

在controller里面添加:

1
public $enableCsrfValidation = false;

或者

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

禁止某一个action使用crsf验证

1
2
3
4
public function beforeAction($action) {
$this->enableCsrfValidation = ($action->id !== "save-order"); // <-- here
return parent::beforeAction($action);
}

2、在ajax添加_csrf参数

1
2
3
4
5
6
7
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
url: 'request',
type: 'post',
dataType: 'json',
data: {param1: param1, _csrf : csrfToken},
});
1
2
3
4
5
6
7
8
$.ajax({
url: '$urlSave',
type: 'post',
data: {payload: payload, _csrf: yii.getCsrfToken()},
dataType: 'json',
}).success(function(response) {
//处理
});

3、在全局里面添加csrf数据

我采用这种方式,所有的ajax都会更新csrf,包括第三方控件。

1
2
3
4
5
6
7
<script>
$.ajaxSetup({
data: <?= yiihelpersJson::encode([
yii::$app->request->csrfParam => yii::$app->request->csrfToken,
]) ?>
});
</script>