Yii2 登陆后返回登陆前页面 不跳回到登陆页
当用户在内容页点击导航登陆连接时, 跳转到登陆页面, 当登陆成功后, yii2默认代码是返回到首页,即$this->goHome();
这样对体验不好, 用户还要再去找原来的内容, 当然如果登陆做成弹窗的形式可以解决问题,但登陆页我感觉还是适当的用比较好,还可以做宣传图在上面,
yii2有个$this->goBack()的方法, 但这里不适用 , 因为登陆页登陆后会post提交, 然后再返回, 返回的时候使用 $this->goBack() 被返回的页面是post提交前的页面,即登陆页
我的解决办法是用referrer,将referrer保存到登陆表单,然后再用路由判断不跳回到登陆页
控制器
控制器代码中的'referrer' => Yii::$app->request->referrer?Yii::$app->request->referrer:'',用于记录跳转到登陆页的页面地址,然后将此地址记录到表单,如下
模板
这样就可以解决跳转到登陆前页面的问题,
不跳回到登陆页
如上的方式可以跳转到登陆前的页面, 但当用户点击进入登陆页,然后在登陆页面再次点击登陆连接, 模板中会记录返回连接为登陆页的地址, 然后登陆成功后返回到登陆页,提交403错误,即没权限访问
然后控制器里有几行代码如下:
这样对体验不好, 用户还要再去找原来的内容, 当然如果登陆做成弹窗的形式可以解决问题,但登陆页我感觉还是适当的用比较好,还可以做宣传图在上面,
yii2有个$this->goBack()的方法, 但这里不适用 , 因为登陆页登陆后会post提交, 然后再返回, 返回的时候使用 $this->goBack() 被返回的页面是post提交前的页面,即登陆页
我的解决办法是用referrer,将referrer保存到登陆表单,然后再用路由判断不跳回到登陆页
控制器
public function actionLogin() {
if (!Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if($model->load(Yii::$app->request->post()) && $model->login()) {
$referrer=Yii::$app->request->post('referrer');
$loginUrl=Yii::$app->user->loginUrl;
if($referrer && Yii::$app->requestedRoute!=$loginUrl[0]) {
$this->redirect($referrer);
} else {
return $this->goHome();
}
} else {
return $this->render('login', [
'model' => $model,
'referrer' => Yii::$app->request->referrer?Yii::$app->request->referrer:'',
]);
}
}
控制器代码中的'referrer' => Yii::$app->request->referrer?Yii::$app->request->referrer:'',用于记录跳转到登陆页的页面地址,然后将此地址记录到表单,如下
模板
<?php $form = ActiveForm::begin(['id' => 'login-form','options'=>['class'=>'form']]); ?>
<input type="hidden" name="referrer" value="<?= $referrer; ?>" />
这样就可以解决跳转到登陆前页面的问题,
不跳回到登陆页
如上的方式可以跳转到登陆前的页面, 但当用户点击进入登陆页,然后在登陆页面再次点击登陆连接, 模板中会记录返回连接为登陆页的地址, 然后登陆成功后返回到登陆页,提交403错误,即没权限访问
然后控制器里有几行代码如下:
如上几行控制器代码,用来判断来源路由是否为loginurl(main,php配置中的参数,没权限跳转的地址),如果是,则跳到首页,$referrer=Yii::$app->request->post('referrer');
$loginUrl=Yii::$app->user->loginUrl;
if($referrer && Yii::$app->requestedRoute!=$loginUrl[0]) {
$this->redirect($referrer);
} else {
return $this->goHome();
}