码迷,mamicode.com
首页 > 其他好文 > 详细

登录记住密码功能的实现

时间:2016-06-18 23:59:14      阅读:503      评论:0      收藏:0      [点我收藏+]

标签:

  用户登录信息开始是利用session保存,短时间内通过判断session可以不用登录,但是时间长或者在关闭浏览器重启之后,还是需要登录操作。而“智慧资产”网站主要在手机网页上使用,一般一个用户一部手机,不需要频繁登录,而且安卓用户一般在使用app软件后,选择关闭退出app软件。

  解决这个问题,我利用有效时长为30天的cookie保存用户名和密码,实现“记住我”的功能。

  在实现过程中,重新学习了解了cookie和session机制:session、cookie与“记住我的登录状态”的功能的实现

  Cookie的机制

  Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。

  Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Cookie的Expires属性标识了Cookie的有 效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。

  如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览会话期的 Cookie被称为会话Cookie。会话Cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把Cookie保存到硬盘 上,关闭后再次打开浏览器,这些Cookie依然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗 口。而对于保存在内存的Cookie,不同的浏览器有不同的处理方式。

 

  Session的机制

  Session是存放在服务器端的类似于HashTable结构(每一种Web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

  一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然,也有使用数据库将这个HashTable序列化后保存起来的,这 样的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。一般还是采取前一种方式,以减轻服务器压力。

  

  这篇博客里面还写到 实现“记住我的登录状态”的功能方法,简言之,就是对首先对session进行用户信息赋值,检测session,失效后,利用cookie对其赋值;

  在实现过程中,根据网上一些代码贴,整理出以下代码:另外可以参考PHP 登录记住密码实现思路

 

在登录login.php页面中,进行表单设置:

<?php
session_start();
?>
<form action="login_chk.php" method="post">   <div class="inpu">     <input id="username" name="username" type="text" class="username" value="<?php if($_SESSION[‘type‘] == 1){echo $_SESSION[‘number‘];}else{echo $_SESSION[‘name‘];}?>" placeholder="用户名">   </div>   <div class="inpu">     <input id="pass" name="pass" type="password" class="password" placeholder="登录密码" >   </div>   <div class="remember">     <input class="inpu_remember" type="checkbox" name="remember" ><label>记住我</label>   </div>   <button id="submit" type="submit">登录</button> </form>

 

login_chk.php页面用于验证登录页面表单信息,并创建cookie:

 1 <?php
 2 header("Content-type:text/html;charset=gb2312");
 3 
 4 session_start();
 5 include_once("conn/conn.php");  //加载数据库连接文件
 6 
 7 error_reporting(0);
 8 
 9 if(empty($_POST[‘username‘]) or empty($_POST[‘pass‘])){
10     echo "<script language=‘javascript‘>alert(‘用户名和密码不能为空!‘);history.go(-1);</script>";
11 }
12 else{ 
13     $username=$_POST[‘username‘];
14     $pass=$_POST[‘pass‘];
15     $password = md5($pass);
16     $remember = $_POST[‘remember‘]; 
17     
18     $testrst = sqlsrv_query($conn, "select * from Employee where name like ‘$username‘ or number like ‘$username‘");    //执行查询操作  
19     
20     if(!empty($remember)){     //如果用户选择了,记录登录状态就把用户名和加了密的密码放到cookie里面 
21         setcookie("username", $username, time()+3600*24*30); 
22         setcookie("password", $pass, time()+3600*24*30); 
23     }  
24     
25     
26     
27      
28     
29     if(sqlsrv_has_rows($testrst)){
30         
31         $rst = sqlsrv_query($conn, "select * from Employee where (name like ‘$username‘ or number like ‘$username‘) and pwd = ‘$password‘");
32         
33         
34         if(sqlsrv_has_rows($rst)){                                                              //判断登录用户名和密码是否正确
35             $adminrow = sqlsrv_fetch_array($rst);
37             $userwhethe = 0;
38             $_SESSION[‘id‘]=$adminrow[0];      
41             $_SESSION[‘number‘]=$adminrow[1];
42             $_SESSION[‘name‘]=$adminrow[2];
43             if($username == $adminrow[1]){
44               $_SESSION[‘type‘] = 1;
45             }else{
46                $_SESSION[‘type‘] = 2;
47             }57 
59               echo "<meta http-equiv=\"refresh\" content=\"0;url=menu.php\" />";
60 64         }else{
65           echo "<script>alert(‘密码错误,请重新登录。‘);history.go(-1);</script>";
66         }
67    }else{
68        echo "<script>alert(‘该用户名不存在!,请重新登录。‘);history.go(-1);</script>";
69    }
70 }
71 
72 ?>

menu.php以及其他功能页面都会检查一遍session:

 1 <?php
 2 session_start();
 3 include_once("conn/conn.php");
 4 error_reporting(0);
 5 if(empty($_SESSION[‘name‘]) and empty($_SESSION[‘id‘])){              //判断当前用户是否为登录状态
 6 echo "<script>alert(‘请登录后再进行执行操作!‘);history.go(-1);</script>";
 7 }else{
 8 ?>
 9 网页主体
10 ?>

至于检验sessionf,失效利用cookie进行赋值的操作,在index1.php(index的检查页)中实现:

 1 <?php
 2 session_start();
 3 
 4  if(empty($_SESSION[‘username‘])){                                      //检查一下session是不是为空 
 5      if(empty($_COOKIE[‘username‘]) || empty($_COOKIE[‘password‘])){  
 6         header("location:login.php");                         
 7      }else{                                                               
 8         $_SESSION[‘name‘] = $_COOKIE[‘username‘];   
 9         header("location:menu.php"); 
10     } 
11       
12  }
13 ?>

另外,考虑到用户有退出系统或者注销再登录的需要,设置了退出页面logout.php:

1 <?php
2 session_start();
3 unset($_SESSION[‘username‘]);
4 unset($_SESSION[‘password‘]);
5 setcookie(‘username‘,‘‘,0);
6 setcookie(‘password‘,‘‘,0);
7 header("location:index.php");
8 ?> 

  实现后,使用流畅。但对密码的cookie和session保存感觉不是很恰当,在用户登录界面也没有对密码表单进行值得默认保存,这个方面的功能还需要完善。

 

登录记住密码功能的实现

标签:

原文地址:http://www.cnblogs.com/hhccdf/p/5597043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!