Yii2:ajax post请求总是重定向到登录页面

时间:2018-05-07 08:22:38

标签: yii2 yii2-advanced-app

我尝试使用ajax POST请求发送数据,但即使我向匿名用户(['actions' => ['update', 'test'], 'allow' => true])授权该方法,我也总是会重定向到登录页面。当我使用GET请求进行测试时没有问题。

我的控制器:

public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                ['actions' => ['update', 'test'], 'allow' => true],
            ],
        ],
    ];
}

public function actionTest() {
    Yii::$app->request->enableCsrfValidation = false;

    echo 'ok';
}

我使用Postman来测试请求

3 个答案:

答案 0 :(得分:1)

您使用的解决方案实际上不是解决方案,如果您无法使用密钥打开锁定就可以解除锁定。

如果您在没有发送CSRF参数的情况下发出Ajax Post请求,那么大多数情况下都会获得400 Bad Request,我从未遇到像重定向到登录页面那样的问题。

但是如果通过禁用CSRF验证来解决您的问题,那么您应该在进行任何ajax请求时遵循此方法。

在您的配置中,您可以使用csrfParam组件中的request来定义csrf参数名称

'request' => [
     'csrfParam' => '_csrf-app',
],

如果已定义,则可能会有所不同。

您必须在ajax请求中使用_csrf-app值发送此参数csrf以及您的post数据。并且为了检索csrf的值,您可以使用javascript yii.getCsrfToken()方法,或Yii::$app->request->csrfToken,如果通过php查看。

如果您的脚本位于视图文件中,请参阅此示例调用您可以硬编码参数_csrf-app的名称或使用Yii::$app->request->csrfParam

$.ajax({
    url:'/add',
    data:{'_csrf-app':yii.getCsrfToken()}
    success:function(data){}
});

希望这能解决你的问题。

答案 1 :(得分:0)

lubosdz的建议解决了这个问题

修改后的控制器:

public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                ['actions' => ['update', 'test'], 'allow' => true],
            ],
        ],
    ];
}

public function beforeAction($action) {
    if ($action->id == 'test') {
        $this->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}

public function actionTest() {
    echo 'ok';
}

答案 2 :(得分:0)

我找到了一个看起来有点像Muhammad Omer Aslam的解决方案:通过在JavaScript中序列化表单,我可以直接发送所有字段和ActiveForm生成的csrf令牌。

$.ajax({
    url: ...,
    type: 'POST',
    data: $('#myForm').serialize(),
    success: (response) => { ... }
})