《deetom》项目开发历程<六> 免登陆
需求:
用户选中10天后面登录。需每次登陆都直接抵达个人中心,为已登录状态
思路:
记录cookie
处于安全考虑,首先前段表单提交前对密码进行MD5加密
若用户选中了10天免登陆则将用户密码和加密密码存入cookie中
注意:cookie不支持存数组。
当用户下一次请求时,先分析有没有cookie,先分析有没有session,若有session(用户登录是会存session),则直接让用户登录。
若没有session,检查cookie
若发现了cookie,将用户名 密码取出来
对密码进行二次加密,请求数据库,检查,若成功,增加session 登陆成功
否则不成功。cookie失效了,或者cookie别改动,或者被冲突掉了。
一些代码:
前段加密部分
$.post("/Login/login?r=" + Math.random(),{ username : $username, password :calcMD5($password), key : "login", loginone : $loginone }, function(data, textStatus) { if($.trim(data) != ''){ alert(data); window.location.href="/UserCenter/info"; } });
设置cookie
if($loginone == 'yes'){ //保存cookie ,免登陆需求。 //密码已加密 $key = "csince_dt_user_info"; //过期时间 十天 //这里放的密码,只是进行了前段加密,后面登陆的时候需要再次加密登陆 setcookie($key,$userName."-".$_POST['password'],time()+864000); }
下次登录检查cookie部分
$cookie_userinfo = $_COOKIE['csince_dt_user_info']; if(!empty($info)){ $this->redirect("/UserCenter/info"); }else{ //如果cookie 不为空 取出cookie中的账号密码 if(!empty($cookie_userinfo)){ $arr = explode('-',$cookie_userinfo); $userName = $arr[0]; $passWord = $arr[1]; //进行密码二次加密 $passWord = $this->csmd5($passWord,'7rDySCWe'); //判断用户名密码是否匹配 $res = $model->where("username = '$userName' and password = '$passWord'")->getOne(); if(!empty($res)){ $session = $this->instance('Session'); $session->set("index_userInfo",$res);//存session $this->redirect("/UserCenter/info"); } } }
积累知识,分享知识,学习知识。