官术网_书友最值得收藏!

  • 貫通Java Web開發三劍客
  • 希賽IT發展研究中心組編
  • 1936字
  • 2018-12-27 18:23:51

1.5 Cookie和Session

讀者可能在平時上網、閱讀某些Internet方面的資料或者在一些可以開發Web應用的開發語言中已經不止一次地看到過Cookie和Session這兩個概念,因為這兩個概念在Web中確實起到了舉足輕重的作用。正如前面在介紹HTTP協議時提到的,HTTP協議是無狀態協議,協議本身不會保存任何對方的狀態信息,但是在許多時候服務器會希望保存一些必要的客戶端信息或者希望能夠在客戶端保存一些信息,以便在客戶端下次訪問時攜帶上這些信息。這就是Cookie機制和Session機制出現的原因。這兩種技術都不是HTTP協議規定的內容,但是它們被廣泛使用于Web系統中。

1.5.1 Cookie

Cookie是Web服務器要求客戶機瀏覽器保存在客戶機本地的一個非常小的文本文件,該文件的內容由服務器指定;同時服務器還指定了一個URL集合,當瀏覽器下次訪問這些URL中的任何一個時都會攜帶上Cookie中的內容。Cookie中的內容實質上是一系列屬性,屬性由屬性名和屬性值組成,屬性名和屬性值都是由Web服務器指定的。

Cookie的實現非常簡單,卻有著旺盛的生命力和廣泛的應用。一個簡單應用Cookie的例子是頁面可以記錄用戶登錄名:當用戶登錄某網站時,會輸入用戶名和密碼,當用戶登錄成功后,Web 服務器會將用戶的登錄名使用Set-Cookie頭域設置到客戶機本地硬盤,并要求客戶機在用戶下一次打開登錄頁面時攜帶用戶的登錄名信息,Web 服務器就可以取出用戶的登錄名信息并且將其設置到用戶名輸入框中。這個過程的HTTP消息序列如表1.8所示。

表1.8 Cookie工作過程

在這個例子中,最關鍵的就是第4步中的Set-Cookie頭域和第6步的Cookie頭域。第4步中服務器告訴客戶機瀏覽器要將username=zhangsan這么一 個名值對記錄到本地Cookie中,第6步瀏覽器在下次訪問該網頁時將該名值對攜帶在HTTP消息中以便于服務器獲得該信息。在Set-Cookie頭域的值中,除了定義需要攜帶的屬性信息外,還定義了expires屬性、domain屬性和path屬性。其中expires表示過期時間,即表示這個Cookie設置到該日期以后就無效了。domain屬性和path屬性合起來規定了一系列URL,即只要訪問的URL的域名是example.com,Request-URI是以/login開始的話,那么就將該Cookie攜帶在HTTP請求頭中。

1.5.2 Session

考慮一個簡單的情形:郵件服務器中每個用戶的郵件內容應該是受密碼保護的,在沒有使用正確的用戶名和密碼登錄后是不能訪問的。用戶的郵箱中有許多資源,例如郵件列表、郵件內容、通訊錄等,由于每個資源都應該受密碼保護,所以用戶在每一次請求任何一個資源時都必須輸入用戶名和密碼,否則別人就有可能通過構造該資源的URL訪問到該資源。這是因為HTTP是無狀態協議,一次請求中的登錄信息無法被其他請求使用。但是,如此頻繁的輸入用戶名和密碼對于用戶來說是無法容忍的。

這種情形在Web應用中是普遍存在的,因為有很多Web應用都需要身份驗證。Session機制是一種服務器端的機制,它可以解決上面提到的情形:當用戶登錄成功時,服務器通過一種特殊的算法生成一個不會重復并且很難找到規律的字符串,稱為Session ID,并且將Session ID保存在本地Session ID庫中(使用一種類似于散列表的結構來保存信息),同時通過某種機制將Session ID告訴給客戶機;當服務器接收到任何訪問受保護資源的請求時,只需要查看請求中是否已攜帶 Session ID 并且檢查攜帶的Session ID是否已在Session ID庫中存在,假如存在則表示該客戶機已成功登錄,否則拒絕該請求。

1.Session ID的傳遞方式

Session ID是Session機制的關鍵,只有通過將Session ID在服務器和客戶機之間傳遞才能夠實現Session的作用。Session ID最常用的傳遞方式是利用Cookie進行傳遞。

當用戶登錄成功后,服務器將 Session ID 作為一個 Cookie 的屬性發送給客戶機,并且適當設置domain和path,使得客戶機在訪問需要受密碼保護的資源時都攜帶上該Cookie屬性。例如:

    ...
    Set-Cookie: sessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99
          zWpBng!-a; expires: Mon, 31-Mar-2008 00:00:00 GMT; domain: example.com;
          path: /mail
    ...
    ...
    Cookie: sessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99
          zWpBng!-a
    ...

除了Cookie的方式,也可以通過URL來傳遞Session ID。當用戶登錄成功后,服務器將在每個需要訪問受密碼保護資源的URL中都加入Session ID,例如:

    http://www.example.com/mail?sessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-a

2.Session ID的過期

關于Session ID過期的問題,常常會有一種誤解:“只要關閉瀏覽器,Session就消失了”。其實簡單考慮就可以明白這是一種誤解,Session是一種服務器機制,Session ID是由服務器生成并且保存在服務器本地的,對于任何一個攜帶Session ID的請求,只要攜帶的Session ID在服務器本地的Session ID庫中存在,就可以訪問受保護的資源,也就是說明Session ID是有效的。可見,Session ID是否過期與客戶機并沒有任何關系,而只與服務器本地的Session ID庫中有哪些Session ID有關,Session ID庫中不存在的Session ID 視為無效;而當客戶機關閉瀏覽器時通常并不會通知服務器,所以服務器也不會主動刪除該Session ID。恰恰是由于關閉瀏覽器不會導致Session被刪除,故服務器才需要為Session設置一個失效時間,當服務器發現客戶端停止活動的時間超過這個失效時間時,就會把對應的Session ID刪除。

Session 的本意是“會話”的意思,會話表示一組順序而且相互關聯的對話過程。HTTP 是無狀態協議,假如將 HTTP 的一次請求/響應過程看作是一次對話,那么無狀態就表示每一次對話和其他對話之間都是沒有關聯的,即本次對話時已經忘記了上次對話的情況甚至已經忘記了以前是否對話過。所以,引入Session機制讓Web服務器與一個客戶端的交流過程更像是一個對話。

主站蜘蛛池模板: 潢川县| 东乡| 万宁市| 商城县| 南安市| 清新县| 高唐县| 奎屯市| 石景山区| 拜泉县| 犍为县| 来安县| 明光市| 民和| 滁州市| 安龙县| 亳州市| 安康市| 雷山县| 九龙坡区| 伽师县| 商南县| 福建省| 屏南县| 河南省| 富宁县| 扬州市| 商水县| 涞源县| 壤塘县| 米脂县| 淮阳县| 长丰县| 南溪县| 汉寿县| 鄂托克前旗| 昭通市| 隆安县| 阳高县| 红桥区| 舟曲县|