2014-11-25 80 views
15

这是我的代码:获取关于Ajax错误的请求(#400)调用使用Yii 2

$(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):无法验证数据提交。

而我已经有<?= Html::csrfMetaTags() ?>。我该如何解决这个问题?

回答

34

您在enableCsrfValidation中遇到问题。要阅读更多关于它,你可以阅读here

要禁用CSRF,该代码添加到您的控制器:

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

这将禁用所有操作。您可能应该根据$操作将其仅用于特定操作。

注意:请参阅the answer from Skullcrasher以更正确的方式执行此操作。

+0

其工作,谢谢.... – Kartz 2014-11-25 12:16:45

+0

它也适用对于我 – 2016-01-08 15:36:10

+0

在这样的背景下(当没有条件影响禁用的结果时),没有必要将它放入beforeAction。您可以将其重新定义到您的控制器中,如下所示: public $ enableCsrfValidation = false; 但是在beforeAction中,你可以指定具体的动作来禁用 – 2016-05-05 12:34:14

25

作为Mihai P.的答复状态,您的问题是CSRF验证。您也可以禁用对您的操作进行验证,但这并不是一个好的解决方案。

由于您的Ajax请求中存在验证问题,您还可以使用Yii JavaScript函数将CSRF标记添加到您在Ajax请求中发送的表单数据。

只是尝试将令牌添加到您的表单数据如下:

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

我希望这可以帮助你因此不必禁用CSRF验证。

除了手动添加CSRF令牌之外,您还可以检查请求中是否存在X-CSRF头部集。

+6

这是更好的答案,不是我的。 – 2015-03-11 21:12:34

+1

它不工作。 – 2016-05-22 19:04:20

4

用途:

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

更多细节:Yii2: Using csrf token

7

在布局的底部添加以下代码:

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

这工作。在配置自己的 更改csrfParam/main.php

'components' => [ 
    'request'=>[ 
     'csrfParam'=>"othername" 
    ], 
    ... 

请记住,你必须在你的请求包括您在配置定义具有相同名称的标记。

2

您需要行动功能可以禁用CSRF验证:

public function beforeAction($action) { 
    if($action->id == "action name need to disable") 
     $this->enableCsrfValidation = false; 
    return parent::beforeAction($action); 
} 

或者使用GET method

+0

这是无效的,因为它增加了遭受csrf攻击的风险。 – Prescol 2017-01-28 23:21:19

0

/backend/config/main-local.php

'components' => [ 
    'request' => [ 
     'cookieValidationKey' => 'unique code', 
     'csrfCookie' => ['httpOnly' => true, 'path' => '/admin/'], 
    ], 
], 

/frontend/config/main-local.php

'components' => [ 
    'request' => [ 
     'cookieValidationKey' => 'unique code', 
     'csrfCookie' => ['httpOnly' => true, 'path' => '/'], 
    ], 
], 
相关问题