Session和Cookie的作用以及實現


  最近學習Session和Cookie的總結,我發現好多做測試的朋友對這個的理解不是那么透徹;如果理解了Cookie和session的原理和使用,在我們的測試工作中,有很大的幫助;尤其是在接口測試,性能測試中。。。   

我把下面的內容做成了一個pdf文檔,有需要看的朋友,可以去百度雲盤下載,地址在文章的最后:

    內容如下:

目錄:

一、為什么要用Cookie和Session?    3
二、Cookie和Session是什么?    3
三、怎么使用Cookie和Session?    5
1、完成Cookie完成記住用戶名的功能:    5
①第一個場景:    5
②第二個場景:    6
③代碼如下:    7
2、完成Session驗證是否已登錄的功能    9
①第一個場景:    9
②第二個場景:    10
③代碼如下:    11
四、Cookie和Session的區別    13

一、為什么要用Cookie和Session?

    很多時候客戶端和服務器進行交互使用了HTTP協議,但是HTTP協議是無狀態的;HTTP協議的請求過程,是基於 TCP/IP 的,當客戶端請求服務器,服務器處理后,進行響應,該過程是無狀態的。

    但是在有些時候是需要保存一些客戶端的請求信息,識別客戶端的某些狀態,智能的、有針對性的去分析某些客戶端的習慣。這些時候,就需要去記錄客戶端的連接狀態,識別請求的狀態等。所以為了解決類似的事情,就需要使用到了 Cookie 和 Session

比如,使用Cookie的場景:有些網站有記住用戶名的功能,當你勾這個的時候,下次進入該網站時,就會保存上一次登錄的用戶名;使用Seesion的場景:利用Seesion來驗證用戶是否已登錄,利用Session來保存驗證碼。

二、Cookie和Session是什么?

    (1)Cookie:在客戶端訪問某個地址時,會將請求交到服務器進行處理,在發送請求的時候,瀏覽器會將頁面的頭部信息一並的交到服務器端進行處理。在處理的過程中,Cookie 在服務器端生成 ,在此同時,可以將一些需要保存的信息,存放到此 Cookie 中。生成 Cookie 對象時,需要確定具體的名稱及具體的值,可以設置當前 Cookie 的過期時間,設置過期時間后,就相當於持久化了 Cookie 中的數據,此時的 Cookie 會以之前的 Cookie 名稱,保存在客戶端。
如果不設置過期時間,則當前 Cookie 的生命期是瀏覽器會話期間,一旦關閉了該瀏覽器,當前的Cookie 就會不存在了,此時的 Cookie 信息是保存在內存中。在服務器端,處理完后,會將生成的 Cookie ,隨着 Http 響應,會在 Http 響應頭中,加上Cookie 信息,瀏覽器接受到響應后,會按照 Http 響應頭里的 Cookie ,在客戶端建立 Cookie 。在下次客戶進行請求的時候,Http 會附帶着已經存儲過的 Cookie,一並發送到服務器。一個域,在客戶端建立的所以 Cookie 都是可以共享的,只要 Cookie 沒有過期。

    (2)Session:Session 是在服務器端生成的,存儲在服務器端,即存在內存中。可以對生成的 Session 設置過期時間,如果不設置過期時間,默認的 Session 過期時間是30 分鍾(在不同的服務器中,它的過期時間略有不同,本文是以 Tomcat 來說的)  但是,Sesssion 的生成的同時,會生成一個與之相關聯的的 SessionID ,此 SessionID的存儲是需要 Cookie 來完成的。 SessionID 是以名稱為 JSESSIONID,其值應該是一個既不會重復,又不容易被找到規律以仿造的字符串。SessionID會隨着此次 Http 響應,一並返回到客戶端,並保存在客戶端中。到當前請求再次發出后,該 SessionID會隨着 Http 頭部,傳到服務器中,服務器依據當前 SessionID 得到與之對應的 Session.

其中:通過 Cookie 的方式存儲 Session 狀態,只是其中一種方式。如果客戶端禁用了 Cookie 的話,很多網站任然可以存儲用戶的信息。一種處理的方式是URL 重寫,將 SesseionID 直接附加在請求地址的后面。另一種處理的方式是,使用隱藏自動的方式。就是服務器自動的在表單中,添加一個隱藏字段,以便在表單提交時,將 SesseionID 一起傳到服務器,進行識別。

(3)總結下:Cookie是存在客戶端的,比如我們電腦的本地文件中(設置的過期時間的話),在我本地的話(C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Cookies):

也可以在瀏覽器中看(chrome):

Session是存在服務器端的(我的apche也安裝在本地的):

發送請求的時候Cookie會自動把Seesionid帶上:

三、怎么使用Cookie和Session?

    首先說明下,下面用的是php來寫的,之所以寫這個過程是加深對Cookie和Session的認識,不會光看理論那里比較抽象。

1、完成Cookie完成記住用戶名的功能:

①第一個場景:

輸入用戶名,選擇保存用戶名-->提交-->打印設置Cookie成功-->返回登錄頁面-->用戶名會自動填寫(只要訪問該登錄頁面,在Cookie有效期內)

這中間設置的Cookie可以在瀏覽器中查看的:

名字為userName,值為:xiaoshitou,保存時間為:1小時

②第二個場景:

輸入用戶名,不選擇保存用戶名-->提交-->打印刪除Cookie成功-->返回登錄頁面-->用戶名的值為空(設置的Cookie會被清空)

③代碼如下:

(兩個文件:saveUserNameView.php、saveUserNameProcess.php):

saveUserNameView.php:(登錄頁面的代碼)

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: LSH
 5  * Date: 2016/11/25
 6  * Time: 11:12
 7  */
 8 ?>
 9 <html>
10 <head>
11     <meta charset="utf-8">
12     <title>保存用戶名</title>
13 </head>
14 <body>
15 <h1>登錄頁面</h1>
16 <form action="saveUserNameProcess.php" method="post">
17     <table>
18         <tr><td>用戶名</td><td>
19                     <input type="text" name="userName" value="<?php if (!empty($_COOKIE['userName'])){echo $_COOKIE['userName'];} ?>"></td></tr>
20         <tr><td>密&nbsp碼</td><td><input type="password" name="password"></td></tr>
21         <tr><td colspan="2"><input type="checkbox" name="saveUserName" value="saveUserName">保存用戶名</td></tr>
22         <tr><td colspan="2"><input type="submit" name="submit" value="提交"></td></tr>
23     </table>
24 </form>
25 </body>
26 </html>

saveUserNameProcess.php:(處理邏輯的代碼,保存Cookie,刪除Cookie)

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: LSH
 5  * Date: 2016/11/25
 6  * Time: 11:12
 7  */
 8 
 9 # 獲取post提交的信息
10 // 獲取用戶名
11 if (!empty($_POST['userName'])){
12     $userName = $_POST['userName'];
13 }
14 // 獲取密碼
15 if (!empty($_POST['password'])){
16     $password = $_POST['password'];
17 }
18 // 獲取是否選擇保存用戶名
19 if (!empty($_POST['saveUserName'])){
20     // 當勾選了,就保存Cookie
21     $saveUserName = $_POST['saveUserName'];
22     // 保存Cookie
23     // userName:設置的Cookie名字
24     // $userName: 用戶提交的用戶名
25     // time()+60*60: 從當前時間開始算,60*60秒;也就保存Cookie的時間,1個小時候Cookie過期
26     setcookie('userName',$userName,time()+60*60);
27     echo "<br>Set Cookie Success!<br>";
28 }else{
29     // 當用戶沒有選擇 保存用戶的時候
30     // 刪除Cookie,就是將Cookie的值清掉,把Cookie設置成過期
31     setcookie('userName','',time()-200);
32     echo "<br>Delete Cookie Success!<br>";
33 }
34 // 返回登錄頁面
35 echo "<a href='saveUserNameView.php'>返回登錄頁面</a>";

2、完成Session驗證是否已登錄的功能

①第一個場景:

輸入用戶名和密碼-->提交-->驗證成功-->進入管理頁面

Login.php(登錄頁面)--->loginProcess.php(處理登錄邏輯頁面)--->admin.php(管理頁面)

登錄驗證成功:loginProcess.php 會將用戶名保存在session中,並且會向客戶端設置Cookie:

服務器端也會報錯一個session文件,內容是admin:

在跳轉到admin.php的時候,sessionid會帶進Cookie中發送給服務器:

②第二個場景:

用戶直接訪問admin.php管理頁面-->直接跳轉到登錄頁面(因為這是非法的,必須登錄成功之后才能訪問)

當直接訪問admin.php頁面時,會跳轉的登錄login.php這樣就控制了,只有登錄成功的用戶才能訪問該頁面

③代碼如下:

Login.php(登錄頁面)--->loginProcess.php(處理登錄邏輯頁面)--->admin.php(管理頁面)

login.php(登錄頁面):

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: LSH
 5  * Date: 2016/11/25
 6  * Time: 14:35
 7  */
 8 ?>
 9 <html>
10 <head>
11     <meta charset="utf-8">
12     <title>保存用戶名</title>
13 </head>
14 <body>
15 <h1>登錄頁面</h1>
16 <form action="loginProcess.php" method="post">
17     <table>
18         <tr><td>用戶名</td><td><input type="text" name="userName"></td></tr>
19         <tr><td>密&nbsp碼</td><td><input type="password" name="password"></td></tr>
20         <tr><td colspan="2"><input type="submit" name="submit" value="提交"></td></tr>
21     </table>
22 </form>
23 </body>
24 </html>

loginProcess.php(判斷用戶名是否正確,設置session)

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: LSH
 5  * Date: 2016/11/25
 6  * Time: 14:41
 7  */
 8 # 獲取post提交的信息
 9 // 獲取用戶名
10 if (!empty($_POST['userName'])){
11     $userName = $_POST['userName'];
12 }
13 // 獲取密碼
14 if (!empty($_POST['password'])){
15     $password = $_POST['password'];
16 }
17 
18 if ($userName == 'admin' && $password == '123456'){
19     // 用戶名為: admin;密碼為: 123456
20     // 登錄成功,跳轉到管理頁面:admin.php
21     header("Location: admin.php");
22     // 設置session
23     session_start();
24     $_SESSION['userName'] = $userName;
25 }else{
26     // 用戶名和密碼錯誤時,返回登錄頁面
27     header("Location: login.php");
28 }

admin.php(根據session來驗證用戶是否登錄,未登錄跳轉到登錄頁面,進行登錄)

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: LSH
 5  * Date: 2016/11/25
 6  * Time: 14:37
 7  */
 8 // 獲取Session 中的userName
 9 session_start();
10 if (!empty($_SESSION['userName'])){
11     // 當userName 有值的時候,就打印歡迎,既然管理頁面
12     echo $_SESSION['userName'].",welcome to my system!";
13     echo "<h1>管理頁面</h1>";
14 }else{
15     // 當$_SESSION['userName'] 為空的時候,說明用戶非法訪問管理頁面
16     // 跳轉到登錄頁面
17     header("Location: login.php");
18 }

四、Cookie和Session的區別

1、Cookie是存在客戶端,Session存在服務器

2、安全性要求高的用Session,要求低用Cookie

3、Cookie只能存儲字符串,Session可以存儲任何信息

4、Cookie如果不設置時間,當關閉瀏覽器時,Cookie就失效,不會在本地保存;Session的生命周期是一個會話(當啟動瀏覽器到關閉瀏覽器)

5、在存儲相對持久的信息時,應考慮使用 Cookie,因為 Cookie 可以以文件的形式,存儲在客戶端。在進行一些登錄的驗證及信息攔截的時候,可以使用 Session。

 

最后,有需要看pdf的朋友可以去百度網盤地址下載:https://pan.baidu.com/s/1pKP4cA3


免責聲明!

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



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