[英]Yii2 ajax bad request (#400)
当我使用此代码时,我收到此错误作为响应:
错误请求 (#400):无法验证您的数据
/**
* Active toggle
*/
$(document).on('click', '[data-toggle-active-menu-items]', function(e){
e.preventDefault();
var id = $(this).data('toggle-active-menu-items');
$.ajax({
url: 'active',
type: 'POST',
data: {'id': id, _csrf: yii.getCsrfToken()},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
if (data.active == 1)
{
$('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-open"></span>');
} else {
$('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-close"></span>');
}
}
});
});
我尝试添加
_csrf: yii.getCsrfToken()
和
contentType: "application/json; charset=utf-8",
数据类型:“json”,
但这不起作用
当我将它添加到我的控制器时它确实有效,但这不好,我不想禁用 csrf 验证
公共 $enableCsrfValidation = false;
我怎样才能解决这个问题?
$.ajax({
url: '$urlSave',
type: 'post',
data: {payload: payload, _csrf: yii.getCsrfToken()},
dataType: 'json',
}).success(function(response) {
});
其他示例: http : //docs.mirocow.com/doku.php?id=yii2 : docs#добавление_csrftoken_в_ajax_запрос_yii2
你可以试试这个方法。 这是工作!
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
url: 'request',
type: 'post',
dataType: 'json',
data: {param1: param1, _csrf : csrfToken},
});
在布局底部添加此代码:
<script>
$.ajaxSetup({
data: <?= \yii\helpers\Json::encode([
\yii::$app->request->csrfParam => \yii::$app->request->csrfToken,
]) ?>
});
</script>
这是我现在的代码,只需忽略 csrf 令牌:
$(document).on('click', '[data-toggle-active-menu-items]', function(e){
e.preventDefault();
var id = $(this).data('toggle-active-menu-items');
$.ajax({
url: 'active',
type: 'POST',
data: {'id': id},
dataType: "json",
success: function(data) {
if (data.active == 1)
{
$('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-open"></span>');
} else {
$('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-close"></span>');
}
}
});
});
就我而言,我通过阻止“站点/保存订单”路由(actionSaveOrder)的 csrf 验证解决了这个问题。
class SiteController extends Controller {
...
public function beforeAction($action) {
$this->enableCsrfValidation = ($action->id !== "save-order"); // <-- here
return parent::beforeAction($action);
}
}
我遇到了同样的问题,但我注意到我忘记在 head 部分添加Html::csrfMetaTags()
并且实际上为我修复了它祝我好运
也许您的 AJAX 标头"Content-Type"
需要更改为"application/x-www-form-urlencoded; charset=UTF-8"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.