COOKIE和Session的原理及異同

1、Cookie詳解數據庫

(1)簡介跨域

由於HTTP協議是無狀態的,即服務器不知道用戶上一次作了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼。爲了作到這點,就須要使用到Cookie了。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。瀏覽器

Cookie(複數形態:Cookies),是指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。緩存

Cookie是由服務端生成的,發送給客戶端(一般是瀏覽器)的。Cookie老是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie:安全

 

內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。服務器

 

硬盤Cookie保存在硬盤裏,有一個過時時間,除非用戶手工清理或到了過時時間,硬盤Cookie不會被刪除,其存在時間是長期的。因此,按存在時間,可分爲非持久Cookie和持久Cookie。cookie

 

 

(2)工做原理網絡

一、建立Cookiesession

當用戶第一次瀏覽某個使用Cookie的網站時,該網站的服務器就進行以下工做:併發

①該用戶生成一個惟一的識別碼(Cookie id),建立一個Cookie對象;

②默認狀況下它是一個會話級別的cookie,存儲在瀏覽器的內存中,用戶退出瀏覽器以後被刪除。若是網站但願瀏覽器將該Cookie存儲在磁盤上,則須要設置最大時效(maxAge),並給出一個以秒爲單位的時間(將最大時效設爲0則是命令瀏覽器刪除該Cookie);

③將Cookie放入到HTTP響應報頭,將Cookie插入到一個 Set-Cookie HTTP請求報頭中。

④發送該HTTP響應報文。

二、設置存儲Cookie

 

瀏覽器收到該響應報文以後,根據報文頭裏的Set-Cookied特殊的指示,生成相應的Cookie,保存在客戶端。該Cookie裏面記錄着用戶當前的信息。

三、發送Cookie

 

當用戶再次訪問該網站時,瀏覽器首先檢查全部存儲的Cookies,若是某個存在該網站的Cookie(即該Cookie所聲明的做用範圍大於等於將要請求的資源),則把該cookie附在請求資源的HTTP請求頭上發送給服務器。

四、讀取Cookie

 服務器接收到用戶的HTTP請求報文以後,從報文頭獲取到該用戶的Cookie,從裏面找到所須要的東西。

(3)做用

Cookie的根本做用就是在客戶端存儲用戶訪問網站的一些信息。典型的應用有:

一、記住密碼,下次自動登陸。

二、購物車功能。

三、記錄用戶瀏覽數據,進行商品(廣告)推薦。

(4)缺陷

①Cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。

②因爲在HTTP請求中的Cookie是明文傳遞的,因此安全性成問題。(除非用HTTPS)

③Cookie的大小限制在4KB左右。對於複雜的存儲需求來講是不夠用的。

 

2、Session詳解

(1)簡介

Session表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。Session是一種服務器端的機制,Session 對象用來存儲特定用戶會話所需的信息。

 

Session由服務端生成,保存在服務器的內存、緩存、硬盤或數據庫中。

(2)工做原理

一、建立Session

當用戶訪問到一個服務器,若是服務器啓用Session,服務器就要爲該用戶建立一個SESSION,在建立這個SESSION的時候,服務器首先檢查這個用戶發來的請求裏是否包含了一個SESSION ID,若是包含了一個SESSION ID則說明以前該用戶已經登錄過併爲此用戶建立過SESSION,那服務器就按照這個SESSION ID把這個SESSION在服務器的內存中查找出來(若是查找不到,就有可能爲他新建立一個),若是客戶端請求裏不包含有SESSION ID,則爲該客戶端建立一個SESSION並生成一個與此SESSION相關的SESSION ID。這個SESSION ID是惟一的、不重複的、不容易找到規律的字符串,這個SESSION ID將被在本次響應中返回到客戶端保存,而保存這個SESSION ID的正是COOKIE,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器。 

二、使用Session

咱們知道在IE中,咱們能夠在工具的Internet選項中把Cookie禁止,那麼會不會出現把客戶端的Cookie禁止了,那麼SESSIONID就沒法再用了呢?找了一些資料說明,能夠有其餘機制在COOKIE被禁止時仍然可以把Session id傳遞迴服務器。

常常被使用的一種技術叫作URL重寫,就是把Session id直接附加在URL路徑的後面一種是做爲URL路徑的附加信息,表現形式爲: 

http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764; 

另外一種是做爲查詢字符串附加在URL後面,表現形式爲: 

http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

還有一種就是表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時可以把Session id傳遞迴服務器。

(3)做用

 

Session的根本做用就是在服務端存儲用戶和服務器會話的一些信息。典型的應用有:

一、判斷用戶是否登陸。

二、購物車功能。

 

3、Cookie和Session的區別

一、存放位置不一樣

Cookie保存在客戶端,Session保存在服務端。

2 、存取方式的不一樣

 Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進制數據,需求先進行編碼。Cookie中也不能直接存取Java對象。若要存儲略微複雜的信息,運用Cookie是比擬艱難的。 

而Session中可以存取任何類型的數據,包括而不限於String、Integer、List、Map等。Session中也可以直接保管Java Bean乃至任何Java類,對象等,運用起來十分便當。可以把Session看作是一個Java容器類。 

三、安全性(隱私策略)的不一樣 

Cookie存儲在瀏覽器中,對客戶端是可見的,客戶端的一些程序可能會窺探、複製以致修正Cookie中的內容。而Session存儲在服務器上,對客戶端是透明的,不存在敏感信息泄露的風險。 假如選用Cookie,比較好的方法是,敏感的信息如帳號密碼等儘可能不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務器後再進行解密,保證Cookie中的信息只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在服務器上,Session裏任何隱私都可以有效的保護。 

四、有效期上的不一樣 

只須要設置Cookie的過時時間屬性爲一個很大很大的數字,Cookie就能夠在瀏覽器保存很長時間。 因爲Session依賴於名爲JSESSIONID的Cookie,而Cookie JSESSIONID的過時時間默許爲–1,只需關閉了瀏覽器(一次會話結束),該Session就會失效。

五、對服務器形成的壓力不一樣 

Session是保管在服務器端的,每一個用戶都會產生一個Session。假如併發訪問的用戶十分多,會產生十分多的Session,耗費大量的內存。而Cookie保管在客戶端,不佔用服務器資源。假如併發閱讀的用戶十分多,Cookie是很好的選擇。

六、 跨域支持上的不一樣 

Cookie支持跨域名訪問,例如將domain屬性設置爲「.baidu.com」,則以「.baidu.com」爲後綴的一切域名均可以訪問該Cookie。跨域名Cookie現在被廣泛用在網絡中。而Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。

相關文章
相關標籤/搜索