Yii2实现登录后跳转至初始请求页面的方法问询
Yii2 实现登录后跳转至初始请求URL
获取初始请求URL的两种实用方式
方式一:利用Yii2用户组件自动处理
Yii2的User组件会自动在未登录用户访问受限页面时,记录下当前请求的URL到returnUrl属性中。登录验证成功后直接调用goBack()方法即可完成跳转:
public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { // 自动跳转到被拦截的初始URL,无记录则跳转首页 return $this->goBack(); } $model->password = ''; return $this->render('login', compact('model')); }
对应的访问控制配置无需额外修改,默认规则即可:
public function behaviors() { return [ 'access' => [ 'class' => \yii\filters\AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], // 已登录用户允许访问 ], [ 'allow' => true, 'actions' => ['login'], // 登录页面允许未登录访问 'roles' => ['?'], ], ], ], ]; }
方式二:手动存储初始URL到Session
如果需要自定义拦截逻辑,可在denyCallback中手动把初始请求URL存入Session,登录成功后读取跳转:
public function behaviors() { return [ 'access' => [ 'class' => \yii\filters\AccessControl::class, 'rules' => [ // 同上访问规则 ], 'denyCallback' => function ($rule, $action) { // 存储当前请求的完整URL到Session Yii::$app->session->set('returnUrl', Yii::$app->request->absoluteUrl); return Yii::$app->response->redirect(['site/login']); }, ], ]; }
登录动作中读取并完成跳转:
public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { // 读取Session中的初始URL,无记录则跳转首页 $returnUrl = Yii::$app->session->get('returnUrl', Yii::$app->homeUrl); // 安全校验:确保跳转URL属于当前站点,防止恶意跳转 if (!Yii::$app->request->getIsLocal($returnUrl)) { $returnUrl = Yii::$app->homeUrl; } return $this->redirect($returnUrl); } $model->password = ''; return $this->render('login', compact('model')); }
关键注意事项
Yii::$app->request->url获取相对路径,absoluteUrl获取完整URL,可根据需求选择。- 必须添加本地URL校验,避免被利用跳转至恶意外部网站。
内容的提问来源于stack exchange,提问作者Juan Alonso
相关产品推荐
相关产品推荐

