Cookie、Session實現“記住登錄狀態”的原理


  進行自動化測試時,發現公司中所有的功能測試用例必須基於一個前提:用戶已登錄的情況下才能測試。基於這種情況,有2種解決方案:1)為所有的testcase添加testng中依賴關系,使其依賴於“登錄”這一條用例執行;2)利用網頁的cookie記住登錄狀態,無需再執行一遍登錄的測試用例。

  在設計測試用例時,有一條原則,就是每個testcase之間盡可能是相互獨立的,不要存在過多的依賴關系。遵循這條原則,我們選擇使用第二種方法,來解決上述問題。本文主要闡述了cookie、session記住登錄狀態的實現原理,方便我們更好地寫測試用例。

Cookie的機制

  在網站中,http請求是無狀態的也就是說即使第一次和服務器連接后並且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie的出現就是為了解決這個問題:當瀏覽器訪問網站后,這些網站將一組數據存放在客戶端,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動攜帶給服務器,服務器通過瀏覽器攜帶的數據就能識別當前用戶

  cookieDomain和Path屬性標識了這個Cookie是哪一個網站發送給瀏覽器的;Expires屬性標識了cookie的有效時間

    1)如果對Expires屬性進行有效時間設置,cookie的有效時間過了之后,這些數據就被自動刪除了此時會話cookie保存在硬盤上。關閉瀏覽器后再次打開,這些cookie依然有效直到超過設定的有效時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗 口。

    2)如果不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不保存在硬盤上而是保存在內存里。

  特點:cookie存儲在本地瀏覽器,且存儲數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用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和cookie的作用類似,都是為了存儲用戶相關的信息。

  特點:cookie存儲在本地瀏覽器,而session存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但會占用服務器的資源

Session的客戶端實現形式(即Session ID的保存方法)

  一般瀏覽器提供了兩種方式來保存,還有一種是程序員使用HTML隱藏域的方式自定義實現:

    1) 使用cookie來保存這是最常見的方法,本文“記住我的登錄狀態”功能的實現就是基於這種方式的。服務器通過設置cookie的方式將Session ID發送到瀏覽器。

      a.如果我們不設置有效時間,這個cookie將存放在內存中成為一個和瀏覽器共存亡的會話cookie。當瀏覽器關閉的時候,cookie消失對應的Session ID就丟失了

      b.如果我們設置這個時間為若干天之后,那么這個Cookie會保存在客戶端硬盤中,即使瀏覽器關閉,這個值仍然存在,下次訪問相應網站時,同樣會發送到服務器上。

    2) 使用URL附加信息的方式也就是像我們經常看到JSP網站會有aaa.jsp?JSESSIONID=*一樣的。這種方式和第一種方式里面不設置cookie過期時間是一樣的。

    3) 第三種方式是在頁面表單里面增加隱藏域,這種方式實際上和第二種方式一樣,只不過前者通過GET方式發送數據,后者使用POST方式發送數據。但是明顯后者比較麻煩。

實現“記住我的登錄狀態”的功能

  前面我們了解到,如果我們將Session ID通過Cookie發送到客戶端的時候設置其有效時間為1年,那么在今后的一年時間內,客戶端訪問我的網站的時候都回將這個Session ID值發送到服務器上,服務器根據這個Session ID從內存或者數據庫里面恢復存放Key-Value對的Hashtable。

  但是,實際上Session並不會一直存在過了一定的時間之后,服務器上的Session就被銷毀,以減輕服務器的訪問壓力。當服務器上的數據被銷毀后,即使客戶端上存放了cookie也沒有辦法“記住我的登錄狀態”了。

  通用的實現辦法是,將用戶的用戶名和加密之后的密碼也通過cookie的方式存放在客戶端,當服務器上的Session銷毀以后,使用cookie里面存 放的用戶名和加密之后的密碼重新執行一次登錄操作,重建Session,並更新客戶端上cookie中存放的的Session ID,而這個操作是發生在用戶請求一個需要身份驗證的頁面資源的背后,對於用戶來講是透明的,於是就達到了“記住我的登錄狀態”的目的了。

 

  具體如何使用上文的方法,在Selenium + testng + java中實現記住登錄狀態,將在下一篇文章中詳細描述。


免責聲明!

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



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