首先我先说明一下,这个自动登入就好像于各个网站那种,

这样的效果!
首先给大家看看我的页面:

然后提交到验证登录的方法。

这个是简单的东西,就不解释了啊,
然后我们想一想,假如判断一个用户登录了一次之后,需要把哪些数据写入到cookie里面去。
我写入的有用户的id,用户名,和用户登录ip,因为ip要用到后来的判断。

然后,还要思考的一个问题就是,写入cookie文明的写入会不安全,所以就要用到加密了。
先给大家贴代码:
//判断是否自动登入
function checkAutoLogin($value,$type=0){
$key = md5(C('AUTO_KEYWORDS'));
if($type){
return str_replace('==','',base64_encode($key^$value));
}
$value = base64_decode($value);
return $key^$value;
}我来说一下这个加密的方式是怎么样的,默认是type是0,意思就是默认不穿参第二个参数的话 就是解密,如果传递了就是加密。然后key值就是自己去配置文件配置的一个参数,最好越复杂越好,
然后就是判断,如果type为真的话,就加密,用ba
假如不传参的话,就直接解密返回回来。
详细还是不会的话,以后说。
继续下一步:

然后就是把cookie写入进去,写入的格式是,第一个是cookie名称,第二个是值,第三个是时间,第四个路径。这个是php基本知识就不多介绍了啊,然后时间也是被我写到配置文件的。
还要写的是session uid 和username都写入进去,写入uid的原因是,还需要判断用户是否已经登录了,假如没有登录,就不会有这个uid存在。
好了,假如你做到这步了,在浏览器的cookie里面会存在一个cookie,名称为auto的。
如图:

这样就是加密的方式写入到cookie里面去了,
然后就是写公用的控制器,因为后台会需要很多控制器,就必须要用到公用控制器,其他的控制器都要继承这个公用控制器。
CommonAction控制器里面第一个就要写一个判断。
判断$_COOKIE['auto']存在,并且$_SESSION['uid']不存在,因为要判断用户不是一个登录的状态,才进行这个判断
然后就要把cookie里面的值解密回来进行判断了
如图:

还是那个方法,当不传递第二个参数的时候就是解密,然后用explode这个字符号分割函数进行分割。
然后继续判断的思路大致为:当你现在登入的ip和cookie里面保存的ip相等时,去把用户名和id拿进去查找数据库,当查找到数据的时候,表示成功,就把uid和username写入带session里面去,

然后 在这个公用控制器里面再最一个判断,当session的uid不存在或者username不存在就跳转到登入页面,我们上面已经把uid和username写入到session里面去了,所以但我们上面的步骤都执行正确了的话,就不会跳到登入页面去了,这就相当于一个自动登录的效果做好了。
再吧公用控制器完整版代码发出来:
<?php
class CommonAction extends Action{
public function _initialize(){
header('Content-type:text/html;charset=UTF-8');
if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){
$auto =explode('|',checkAutoLogin($_COOKIE['auto']));
$ip = get_client_ip();
if($auto[2] == $ip){
$where =array(
'id'=>$auto[0],
'username' =>$auto[1],
);
$user= M('admin')->where($where)->find();
if($user && !$user['lock']){
session('uid',$user['id']);
session('username',$user['username']);
}
}
}
if(!isset($_SESSION['uid']) && !isset($_SESSION['username'])){
redirect(U('Admin/Login/index'));
}
}
}
?>然后就是退出登入了,退出登入就是把session清空,然后就是把cookie时间-1就是相当于把cookie给过期掉。
好了,完结,还是那句话,说的不好的欢迎指出来,我会参照您的进行修改的,如果说的不好,别喷~~谢谢
最佳答案