高春庚
(濟源職業技術學院信息工程系 河南 濟源 459000)
由于HTTP協議是無狀態協議,服務器對用戶的請求進行響應后,就會關閉與該客戶端的連接,因此當用戶通過同一個客戶端再次發出請求時,服務器不能判斷該請求是否來自同一個客戶端。在某些情況下,Web服務器為了能夠給用戶提供更好的服務,必須能夠跟蹤客戶的狀態信息。為了解決這一問題,Netscape公司推出了Cookie這一狀態管理機制[1]。
在Web應用中,Cookie是HTTP協議制定的一種會話跟蹤技術,是一種被廣泛采用的記錄客戶端用戶信息的技術。當用戶通過客戶端瀏覽器第一次訪問Web服務器時,Web服務器會在響應頭中增加Set-Cookie頭字段,把信息以Cookie的形式發送給客戶端瀏覽器,這些信息可以是用戶ID、訪問時間、訪問記錄等。當客戶端瀏覽器再次訪問Web服務器時,會把保存的Cookie再發送給服務器,以便服務器對瀏覽器做出相應的響應[2]。通過Cookie技術可以將用戶信息保存在客戶端,從而減輕服務器的負擔[3]。
Set-Cookie響應頭字段以鍵值對的形式設置Cookie,一個Cookie只保存一個鍵值對[4]。如圖1所示,在圖中,服務器向客戶端保存了兩個Cookie,name和age表示Cookie的名稱;zhangsan和30分別是其值;Expires是Cookie的過期時間。如果沒有設置Cookie的過期時間,在瀏覽器關閉的時候,該Cookie的生命就結束了。Cookie必須以鍵值對的形式存在,一個Cookie可以設置多個屬性,不同屬性之間必須以分號和空格分隔。
圖1 HTTP響應頭
客戶端瀏覽器收到服務器發送的Cookie信息,會將該信息保存在瀏覽器的緩沖區中,當瀏覽器以后再次訪問服務器時,會把該服務器保存的Cookie以HTTP請求頭的形式發送給Web服務器[5],見圖2。
圖2 HTTP請求頭
在Servlet API中定義了一個類,名稱為Cookie,位于javax.servlet.http包中。利用Cookie類可以創建Cookie、獲取Cookie屬性信息。Cookie類的構造方法和常用方法如下[2]。
Cookie類的構造方法只有一種形式,其語法格式為:public Cookie(String name,String value)。該方法中,參數name表示Cookie的名稱,value表示Cookie的值。Cookie被創建后,它的名稱不能再更改,其值可以為任何值,創建后可以被修改。
通過Cookie的構造方法創建Cookie對象后,便可調用該類的方法,其常用方法見表1。
表1 Cookie類常用方法
setMaxAge(int expiry)和getMaxAge()兩個方法用于設置和返回Cookie在瀏覽器上保存的有效時間,以秒為單位。如果設置的expiry值為一個正整數,瀏覽器會將Cookie信息保存在本地硬盤中,有效時長由expiry的值決定;如果設置的expiry值為負整數,瀏覽器會將Cookie信息保存在緩存中,當瀏覽器關閉時,Cookie信息會被刪除;如果設置expiry為0,則表示瀏覽器會馬上刪除這個Cookie。
setPath(String uri)和getPath()兩個方法是針對Cookie的Path屬性的。如果創建Cookie對象時沒有設置Path屬性,其默認值是當前訪問路徑的父路徑。瀏覽器訪問Web服務器時,如果訪問路徑中包含某個Cookie的路徑,就會將該Cookie以HTTP請求頭的形式發送給Web服務器。
當用戶訪問某些Web應用時,經常會顯示出上次訪問時間。本文通過一個具體的案例來實現顯示用戶上次訪問時間。
(1)創建Web工程,在工程下新建Servlet并命名為LastAccess,偽代碼如下:
String lastAccessTime = null;
Cookie[]cookies=獲取服務器發送的所有Cookie
for(int i=0;i if(名稱為lastAccess的Cookie存在){ lastAccessTime = 獲取名稱為lastAccess的Cookie的值 break; } } if(lastAccessTime的值為null){ 輸出"您是第一次訪問本站!" }else{ 輸出"您上次訪問時間是:lastAccessTime" } //創建Cookie,將當前時間作為Cookie的值發送給客戶端 String currentTime = 獲取當前時間 Cookie cookie = new Cookie("lastAccess",currentTime); //設置cookie的有效時間為24小時,并發送到客戶端 cookie.setMaxAge(60*60*24); response.addCookie(cookie); } (2)啟動服務器,在瀏覽器輸入訪問地址,由于是第一次訪問,會在瀏覽器中看到“您是第1次訪問本站”,見圖3。 圖3 第1次訪問 (3)重新訪問該地址,會發現服務器獲取到了用戶上次的訪問時間,見圖4。 圖4 再次訪問結果 圖4之所以顯示了用戶的上次訪問時間,是因為第一次訪問時,LastAccess向瀏覽器發送了保存用戶訪問時間的Cookie信息。當再次通過瀏覽器訪問時,只要Cookie設置的有效時間沒有結束,用戶就可以看到上次的訪問時間。 本文介紹了基于Cookie的會話跟蹤及其應用。主要介紹了Cookie的概念,Cookie類常用的方法,最后通過一個實例,實現了通過Cookie技術,獲取用戶上次訪問Web資源的時間。通過實驗證明,達到了預期的效果。當然,本方法還有進一步完善的地方,如在跟蹤用戶狀態的同時,要考慮Cookie的安全問題、用戶隱私的保護等,在以后的研究中要進一步完善。5 結語