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

Yii2 : ajax post request always redirect to login page

我正在尝试使用 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 来测试请求

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';
}

您使用的解决方案实际上不是解决方案,如果您无法用钥匙打开锁,只需拔出锁即可。

大多数情况下,如果您在不发送 CSRF 参数的情况下发出 Ajax Post 请求,您会得到 400 Bad Request,我从未遇到过被重定向到登录页面的问题。

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

在您的配置中,您使用 csrfParamrequest 组件中定义 csrf 参数名称,如下所示

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

如果已经定义,这对您来说可能会有所不同。

您必须将此参数 _csrf-app 与 ajax 请求中的 csrf 值连同您的 post 数据一起发送。为了检索 csrf 的值,您可以使用 javascript yii.getCsrfToken() 方法,或者如果通过 php.

查看,则可以使用 Yii::$app->request->csrfToken

查看此示例调用,您可以对参数的名称进行硬编码 _csrf-app,或者如果您的脚本在视图文件中,则使用 Yii::$app->request->csrfParam

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

希望这能解决您的问题。

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

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