You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

YII2登录成功后如何返回用户之前访问的页面?

嘿,这两个需求在Yii2里都能通过框架自带的身份验证机制轻松实现,不用自己折腾复杂的跳转逻辑,我给你详细拆解一下:

需求一:登录成功后返回用户上次输入的URL

核心思路是在用户进入登录页时,把他的来源页面URL存起来,登录成功后再跳转回去。具体实现可以在登录动作里完成:

public function actionLogin()
{
    // 如果已经登录,直接跳首页
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    // 处理登录提交逻辑
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        // 登录成功后跳转到之前存的returnUrl,没有的话默认跳首页
        return $this->goBack();
    }

    // GET请求进入登录页时,把来源URL设为returnUrl
    if (Yii::$app->request->isGet) {
        $referrer = Yii::$app->request->referrer;
        if ($referrer) {
            Yii::$app->user->setReturnUrl($referrer);
        }
    }

    $model->password = '';
    return $this->render('login', [
        'model' => $model,
    ]);
}

这里的关键是Yii::$app->user->setReturnUrl()把来源页存到session中,$this->goBack()会自动读取这个值完成跳转。如果用户是直接在地址栏输入登录页URL,referrer为空,goBack()就会默认跳首页,这是合理的场景处理。

需求二:访问需登录页面时,未登录跳转登录,登录后返回原页面

这个需求Yii2的AccessControl过滤器已经帮我们处理了核心逻辑,只需要正确配置访问规则,再配合登录动作的goBack()即可:

第一步:配置访问控制规则

在需要控制的控制器(比如SiteController)的behaviors()方法里,添加AccessControl规则,指定哪些动作需要登录权限:

public function behaviors()
{
    return array_merge(parent::behaviors(), [
        'access' => [
            'class' => \yii\filters\AccessControl::class,
            'rules' => [
                // 允许未登录用户访问登录页和错误页
                [
                    'actions' => ['login', 'error'],
                    'allow' => true,
                ],
                // 仅允许已登录用户访问page2动作
                [
                    'actions' => ['page2'],
                    'allow' => true,
                    'roles' => ['@'], // @代表已登录用户
                ],
                // 其他所有动作,未登录用户禁止访问
                [
                    'allow' => false,
                    'roles' => ['?'], // ?代表未登录用户
                ],
            ],
            // 未登录用户访问受限页面时,自动跳转到登录页
            'denyCallback' => function ($rule, $action) {
                return $this->redirect(['site/login']);
            },
        ],
    ]);
}

第二步:确保登录成功跳转用goBack()

直接复用需求一里的登录动作代码即可。因为当AccessControl拦截未登录用户访问page2时,会自动把page2的URL设置为returnUrl,所以登录成功后调用$this->goBack()就会自动跳回page2

额外注意点

  • 如果你用的是Yii2默认模板,SiteController里已经有AccessControl的基础配置,只需要把page2加到需要登录的动作列表里就行。
  • 可以给goBack()传默认跳转地址,比如$this->goBack(['site/index']),避免没有returnUrl时的异常情况。

内容的提问来源于stack exchange,提问作者sibananda

火山引擎 最新活动