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 请求时遵循此方法。
在您的配置中,您使用 csrfParam
在 request
组件中定义 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) => { ... }
})
我正在尝试使用 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 请求时遵循此方法。
在您的配置中,您使用 csrfParam
在 request
组件中定义 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) => { ... }
})