淺談session/cookie

      Session 和Cookie是常用的Web跟蹤技術。Cookie保存在客戶端,而Session則保存在服務器端,二者結合使用來跟蹤用戶的會話狀態,是http協議的一種擴展技術。之所以說是一種擴展技術,是由於Session和cookie是作爲http協議的一種補充,用於彌補http協議的無狀態特性而引入的,從而保持用戶與服務器之間的狀態信息。

1. Cookie機制

1.1 Cookie的功能

     在Web程序中,保持會話的狀態是很重要的一件事。理論上,應該爲每個用戶保持一個會話,同一個用戶的所有請求操作都應該屬於同一個會話,而另一個用戶的所有請求應該屬於另一個會話,用於區別不同的用戶操作。以網上購物爲例,A用戶購買的任何商品應該放在A用戶的購物車中,而B用戶購買的所有物品應該放在B用戶的購物車中,二者不屬於同一個會話,因此彼此之間不能混淆。

     Web應用程序使用過http協議傳輸數據的。http協議是一種無狀態的協議,一旦一次數據交換完成,客戶端與服務器之間的鏈接就會斷開,再次交換數據需要建立新的鏈接,這也就是意味着http協議無法保持客戶端與服務端之間的狀態,跟蹤用戶的會話信息。同樣以網購爲例,當A用戶購買了一種商品並放在自己的購物車中,當A用戶再次購買商品的時候服務器已經無法判斷該購買行爲是否屬於A用戶,也就是說兩次操作彼此之間沒有任何的關聯,造成用戶操作的不便,嚴重影響用戶的體驗。爲了能夠跟蹤特定用戶的信息,需要一種能夠記錄該用戶信息的技術,Cookie便是一種被廣泛使用的技術。

      簡單來說,Cookie是在http協議下在客戶端維護用戶信息的一種方式,由Web服務器保存在用戶端的一種小的文本文件,用於記錄用戶的信息,如ID,密碼,瀏覽過的網頁,停留的時間,個人設置等等信息。在Cookie的有效期內,如果用戶訪問以前訪問過的某個站點,服務器通過讀取Cookie採取相應的動作,如設置個性化的網頁、用戶不必重新輸入用戶名和密碼就可以重新登錄等等。

1.2 Cookie的工作原理

     (1).用戶在第一次訪問某個網站的時候是客戶端是不存在可用的Cookie的,當服務器接收到用戶的請求之後,如果用戶設置允許使用Cookie,那麼服務器會將一部分信息連同請求的頁面一起返回給用戶,從而建立起Cookie。

     (2).用戶再次訪問相同的網站,那麼該瀏覽器會在用戶的電腦上面尋找可用的Cookie,如果找到,則在發送的http請求的頭部中將包含該Cookie,服務器通過檢查該Cookie用於確定用戶的信息。如果沒有找到則說明是第一次瀏覽該網站,則使用(1)中的方式建立Cookie。

    Cookie是利用網頁代碼中的 http請求的頭部信息進行傳遞的,瀏覽器的每一次請求都可以伴隨着Cookie傳遞。

1.3 Cookie的有效期

     有效期指的是Cookie記錄的存放時間,可以通過設置Cookie的Expire字段進行調整。如果Cookie不設置超時事件的話,則存放在瀏覽器的內存中,那麼伴隨着瀏覽器的關閉Cookie會被清除掉;但是如果Cookie設置了生存期,則存放在客戶的硬盤裏面的話,那麼即使瀏覽器關閉也不會造成Cookie的丟失,如果下次啓動瀏覽器的時間在Cookie的生存期內,則該Cookie依然可以使用。

1.4 設置Cookie的屬性

    Cookie的屬性包括name, value, expire, path, domain,secure組成。

    其中name代表的是Cookie的名字,value爲對應的值;expire字段設置cookie的過期時間,以秒爲單位;path設置Cookie的路徑,該路徑決定了可以訪問該cookie的頁面,一般而言與創建Cookie的頁面處於同一個目錄或者創建Cookie頁面的子目錄下的網頁可以訪問該Cookie。如果希望父級或者整個網頁都能夠使用Cookie,則需要進行路徑的設置,如令path=/;域名domain能夠解決在同一個域名下訪問Cookie的問題,通過指定可訪問Cookie的主機名來進行設置。例如“www.baiu.com"與"mp3.baidu.com"公用一個關聯的域名“baidu.com",如果想要讓”www.baidu.com"下的Cookie能夠被“mp3.baidu.com”訪問,我們就需要用到Cookie的domain屬性,並且需要把path設置爲"/";secure用於決定該cookie是否採用安全的協議(https,ssl等)進行傳輸。

2. Session機制

2.1 Session的功能

    Session的功能與Cookie的功能是相同的,只是所在的位置不同。Cookie用於在客戶端記錄用戶的狀態信息,Session用於在服務器端存儲用戶會話所需要的屬性及配置信息,這樣當用戶在應用程序的Web頁面之間跳轉的時候,存儲在Session對象中的變量將不會丟失,而是在整個用戶的會話期間一直保持下去。

2.2 Session的工作機制

    (1).用戶在第一次訪問一個服務站點的時候,Session被自動創建,生成唯一的session id,如果允許使用Cookie,則這個唯一的標示也會隨着服務器回覆的請求返回給用戶並保存在Cookie中。當然也不是訪問所有的站點都會生成對應的Session,只有在訪問JSP、Servelet等Web程序的時候創建對應的Session,而訪問諸如HTML、IMAGE等靜態的Web應用程序的時候並不會創建Session。

    (2).(php中)首先使用session_start()函數,php中從session庫中加載已經存在的session變量;當執行腳本語言的時候使用session_register()註冊session變量;腳本執行結束的時候,未被銷燬的session變量會被自動保存在本地的一定路徑下的session庫庫中,以備下次加載使用,以騰出內存供其餘的用戶使用,不致於導致內存的溢出。

2.3 Session的有效期

    在服務器端保存的session不管客戶端是否還需要Session,並且服務器也無法確定客戶端什麼時候再次需要Session,但是如果不及時銷燬session的話,很快就會造成服務器的內存不足。爲了能夠有足夠的內存共後來的用戶使用,創建Session的時候爲Session設置了聲明週期。

    銷燬銷燬一個Session只能通過兩種方式:

    (1).顯示調用session.invalidate()方法。

    (2).Session超出其生命週期。Session生成之後,只要用戶繼續訪問,服務器就會及時更新用戶對應的Session。用戶每訪問該網站一次,無論是否讀寫Session,服務器都會認爲該用戶的Session活動了一次。如果用戶的Session創建於上午10:00,而其聲明週期設置爲20分鐘的話,則如果用戶在10:00-10:20沒有活動的話,Session被銷燬;若用戶在10:10重新訪問該網頁,則其有效期持續到10:30.

2.4 Session的方法名和說明

     void setAttribute(String attribute,Object value)                    設置Session屬性

     string getAttribute(String attribute)                                    獲取Session屬性

     Enumeration getAttributeNames()                                       獲取Session中存在的屬性名

     void removeAttribute(string attribute)                                 移除Session屬性

     String getId()                                                                   返回Session的ID。該ID由服務器自動創建,不會重複。

     long getCreationTime()                                                      返回Session的創建日期。返回類型爲long,經常被轉化爲Date類型,如Date createtime=new Date(session.                                                                                                 getCreationTime())

     long getLastAccessedTime()                                               返回Session的最後活躍時間,同樣可以轉化爲Date.

     int getMaxInactiveInterval()                                               返回Session的超時事件,單位爲秒

     void setMaxInactiveInterval(int second)                               設置Session的最大超時時間

     void putValue(string attribute, Object value)                        不建議使用,已被setAttribute(string attr)所取代

     Object getValue(string attribute)                                        不建議使用,已經被getAttribute(string attr)所取代

     boolean isNew()                                                                返回Session是否是最新創建的

     void invaliddate()                                                              使該Session失效

     以上各個函數相對於Session對象,在不同的語言中可能會有會有不同的實現。例如php中的session_destroy()用於清除一個session文件,session_unset()用於清除內存中的session記錄。

    雖然Session對於用戶而言是透明的,但是Session的實現需要客戶端的某些支持。Session的使用需要Cookie作爲標誌,http協議是無狀態的,Session無法依據http協議判斷兩次請求是否是同一用戶。當用戶請求在服務端得到響應之後,服務端會發送名爲JSESSIONID的cookie給客戶端,其值爲該Session的id。Session依據該Cookie判斷是否爲同一個用戶。該Cookie是服務器自動生成的,一般僅在當前瀏覽器內有效,並且在瀏覽器的窗口間不共享,關閉瀏覽器則失效。因此同一臺電腦的兩個瀏覽器窗口訪問服務器時,會生成兩個不同的Session。但是由瀏覽器窗口內的鏈接、腳本等打開的窗口(也就是不是重新雙擊瀏覽器圖標等打開的窗口)除外。由瀏覽器窗口內的鏈接、腳本等打開的窗口共享父窗口的Cookie,因此會共享同一個Session。例如,通過單擊鼠標右鍵在彈出的快捷鍵菜單中選擇“在新窗口中打開”時,子窗口便可以訪問父窗口的Session。

2.5 Session對於Cookie的依賴特性

   如果客戶端在瀏覽器的設置中禁止使用Cookie,則採用URL重寫的方案代替。URL地址重寫是將該用的Session id信息重寫到URL地址中。服務器根據重新的URL獲取Session的id。

總結:

   Session與Cookie往往是結合使用,從而發揮強大的作用。打個比方來說,用戶是某家商場的會員,那麼用戶擁有該商場分配給該用戶的ID或者是持有該商場的會員卡。用戶每次購物都會出示自己的會員卡或者是直接告訴店員自己在該商場的ID,用於表明自己的身份,這就是Cookie的作用,是表明用戶身份的“證件"。但是用戶出示了會員卡或者是用戶說出了自己的ID,那麼商場的櫃員會在自己的系統或者記錄中尋找該用戶的信息,商場中保存用戶信息的系統或者記錄就是Session,是用於覈對用戶信息的一種機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章