登錄記住密碼功能的實現


  用戶登錄信息開始是利用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保存感覺不是很恰當,在用戶登錄界面也沒有對密碼表單進行值得默認保存,這個方面的功能還需要完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM