我们在写网站的时候经常会出现这种情况,登录的时候,老是说你的页面中包含循环重定向的内容.
下面我就来说明一下几种常见的情况.
在thinkphp中,如果是后台的话,要求必须登录才能进入到主管理界面.那么我们可以通过这种方法来实现.
在控制器中建立一个 CommonController 通用控制器,然后在里面写一个
public function _initialize(){
//检查是否有session('username')的内容,如果没有则跳转到登录页面...
没有登录,则跳到登录控制器
$this->error("请登录",U('login/login'));
}
然后后台所有的控制器都要继承这个CommonController ,并且在每个控制器中都写这个函数
public function _initialize(){
parent::_initialize();//必须写上这一句,否则子类将会复写父类的方法,这样父类的验证操作就失效了..
}
这里有没有考虑过这样的问题....
如果我们的登录控制器是LoginController ,也继承这个CommonController的话,问题就来了,当你登录到后台的任何一个页面时,都会提前进行CommonController的_initialize检查登录操作,没有登录,则跳到Login控制器,好了跳到Login控制器之后,又将调用CommonController的_initialize 函数..这就是问题的所在了...
解决方案,要么LoginController不继承CommonController,要么在LoginController中的必须写_initialize()
但是不要执行父类的_initialize()
public function _initialize(){
//做你想做的事情..
//不要使用parent::_initialize();即可
}
好了,如果是前台呢,前台分为几种情况.一种是必须登录,一种是部分模块需要登录.
对于必须登录的这种情况和后台类似了.
下面我们来说说部分模块需要登录的情况.
同样使用后台的方法...
我们可能需要就是当我点击某个模块之后,检查是否登录,没有登录则登录,登录完毕之后跳入我刚才点击的模块.
这里的问题是我们怎么保存我们之前点击的内容的呢..
这里有很多种解决方案,比较好的就是使用ajax方法实现.页面无刷新动态提交,还有我们可以在相应需要登录的模块直接将登录的模板引入进来.
不知大家是否意会到我的思路..
就是我们加入进入到我的博客模块.
public function index(){
if(not_login){
$this->display("将登录的视图引入进来");
exit;
}
else{
///
}
}
当然相对于的我们的登录控制器在登录成功之后就不要跳转了....直接返回登录成功即可..
public function login(){
if(success){
$this->success('登录成功!');
}
}
好了,搞定.
这是PHP中的实现,在Laravel框架或者其他的模块中,我们都要考虑这些问题...
我们使用过滤器来解决这个问题,同样的,我们不要在登录的路由上面增加这个过滤器就可以了.
还有一种情况是,如果你在过滤器中这么写
if(检测成功){
//跳转到首页..
}else{
//跳转到登录....
}
这块就有个问题了..如果你统一跳转到首页,好,第一次程序检测到你没有登录,然后跳转到登录界面,当你登录完毕之后,
系统将会跳转到首页...
在首页的控制器中,又将判断是否登录,发现登录,又跳到首页....
这样也是会出现循环重定向的...
解决办法,在过滤器中就不要写成功嘛,直接检测失败不就行了..
要是想成功直接跳转到首页,,其登录那里写,如果登录成功,就统一跳转到首页..
好了,希望你能看懂它.
Persistence makes life valuable .
Best Wishes.
转载于:https://blog.51cto.com/gaoshan2016/1843453