一. 概念理解
你可能有留意到當你瀏覽網頁時,會有一些推送訊息,大多數是你最近留意過的同類東西,比如你想買桌子,上**搜了一下,結果連著幾天會有各種各樣的桌子的鏈結。這是因為你瀏覽某個網頁的時候,web 伺服器會先送一些資料放在你的計算機上,類似於你打的文字,選的一些東西什麼的,cookie 會幫你都紀錄下來。當下次你再光臨同乙個**,web伺服器會先看看有沒有它上次留下的 cookie 資料,有的話,就會依據 cookie裡的內容來判斷使用者,送出特定的網頁內容給你。 cookie 的使用很普遍,許多有提供個人化服務的**,都是利用 cookie來辨認使用者,以方便送出使用者量身定做的內容。
然而,cookie是什麼呢?session又是什麼?
先來了解幾個概念。
1、無狀態的http協議:
協議是指計算機通訊網路中兩台計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議(http)是一種通訊協議,它允許將超文字標記語言(html)文件從web伺服器傳送到客戶端的瀏覽器。
http協議是無狀態的協議。一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。這就意味著伺服器無法從連線上跟蹤會話。
2、會話(session)跟蹤:
會話,指使用者登入**後的一系列動作,比如瀏覽商品新增到購物車並購買。會話(session)跟蹤是web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是cookie與session。cookie通過在客戶端記錄資訊確定使用者身份,session通過在伺服器端記錄資訊確定使用者身份。
二. cookie
由於http是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。使用者a購買了一件商品放入購物車內,當再次購買商品時伺服器已經無法判斷該購買行為是屬於使用者a的會話還是使用者b的會話了。怎麼辦呢?就給客戶端們頒發乙個通行證吧,每人乙個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是cookie的工作原理。
cookie實際上是一小段的文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發乙個cookie。客戶端會把cookie儲存起來。
1、cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。
1)name 和 value 屬性由程式設定,預設值都是空引用。
2)domain屬性的預設值為當前url的網域名稱部分,不管發出這個cookie的頁面在哪個目錄下的。
3)path屬性的預設值是根目錄,即 」/」 ,不管發出這個cookie的頁面在哪個目錄下的。可以由程式設定為一定的路徑來進一步限制此cookie的作用範圍。
4)expires 屬性,這個屬性設定此cookie 的過期日期和時間。
2、path和domain屬性
–path:
如果 建立了乙個cookie,那麼在目錄裡的所有頁面,以及該目錄下面任何子目錄裡的頁面都可以訪問這個cookie。這就是說,在test2/test3 裡的任何頁面都可以訪問建立的cookie。但是,如果 需要訪問設定的cookes,該怎麼辦?這時,我們要把cookies的path屬性設定成「/」。在指定路徑的時候,凡是來自同一伺服器,url裡有相同路徑的所有web頁面都可以共享cookies。
–domain:
比如: 頁面中發出乙個cookie,domain屬性預設就是www.baidu.com ,可以由程式設定此屬性為需要的值。值是網域名稱,比如www.china.com。這是對path路徑屬性的乙個延伸。如果我們想讓 www.china.com能夠訪問bbs.china.com設定的cookies,該怎麼辦? 我們可以把
domain屬性設定成「china.com」, 並把path屬性設定成「/」。
3、會話cookie和持久cookie
若不設定過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器視窗,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在瀏覽器的不同程序間共享。這種稱為持久cookie。
三. session
session是另一種記錄客戶狀態的機制,不同的是cookie儲存在客戶端瀏覽器中,而session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。這就是session。客戶端瀏覽器再次訪問時只需要從該session中查詢該客戶的狀態就可以了。每個使用者訪問伺服器都會建立乙個session,那伺服器是怎麼標識使用者的唯一身份呢?事實上,使用者與伺服器建立連線的同時,伺服器會自動為其分配乙個sessionid。
1、兩個問題:
1)什麼東西可以讓你每次請求都把sessionid自動帶到伺服器呢?顯然就是cookie了,如果你想為使用者建立一次會話,可以在使用者授權成功時給他乙個唯一的cookie。當乙個使用者提交了表單時,瀏覽器會將使用者的sessionid自動附加在http頭資訊中,(這是瀏覽器的自動功能,使用者不會察覺到),當伺服器處理完這個表單後,將結果返回給sessionid所對應的使用者。試想,如果沒有 sessionid,當有兩個使用者同時進行註冊時,伺服器怎樣才能知道到底是哪個使用者提交了哪個表單呢。
2)儲存需要的資訊。伺服器通過sessionid作為key,讀寫到對應的value,這就達到了保持會話資訊的目的。
2、session的建立:
當程式需要為某個客戶端的請求建立乙個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了sessionid,如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照sessionid把這個session檢索出來使用(檢索不到,會新建乙個),如果客戶端請求不包含sessionid,則為此客戶端建立乙個session並且生成乙個與此session相關聯sessionid,sessionid的值是乙個既不會重複,又不容易被找到規律以仿造的字串,這個sessionid將被在本次響應中返回給客戶端儲存。
3、禁用cookie:
如果客戶端禁用了cookie,通常有兩種方法實現session而不依賴cookie。
1)url重寫,就是把sessionid直接附加在url路徑的後面。
2)表單隱藏字段。就是伺服器會自動修改表單,新增乙個隱藏字段,以便在表單提交時能夠把session id傳遞歸伺服器。比如:
4、session共享:
對於多**(同一父域不同子域)單伺服器,我們需要解決的就是來自不同**之間sessionid的共享。由於網域名稱不(aaa.test.com和bbb.test.com),而sessionid又分別儲存在各自的cookie中,因此伺服器會認為對於兩個子站的訪問,是來自不同的會話。解決的方法是通過修改cookies的網域名稱為父網域名稱達到cookie共享的目的,從而實現sessionid的共享。帶來的弊端就是,子站間的cookie資訊也同時被共享了。
總結:
cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。cookie是存放在本地的,session則存放在伺服器當中,相比較session會比cookie更安全,但是訪問量增加是,session會占用較多伺服器的效能。如果要考慮到伺服器效能方面,使用cookie會更好。
cookie與session的關聯
前提 cookie沒有被禁用。當用瀏覽器登入到某 伺服器時,先找對應的cookie檔案,當首次訪問是當然沒有cookie檔案,所以在請求頭部中沒有cookie的內容,即在請求頭部中沒有類似cookie jsessionid 的內容,這時當請求到達伺服器後,伺服器看請求頭中沒有jsessionid值,...
session與cookie的區別
讓我們用幾個例子來描述一下cookie和session機制之間的區別與聯絡。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案 1 該店的店員很厲害,能記住每位顧客的消費數量,...
session與cookie的區別
1 session儲存在伺服器,客戶端不知道其中的資訊 cookie儲存在客戶端,伺服器能夠知道其中的資訊。2 session中儲存的是物件,cookie中儲存的是字串。3 session不能區分路徑,同乙個使用者在訪問乙個 期間,所有的session在任何乙個地方都可以訪問到。而cookie中如果...