簡述cookies 和 session

session

HTTP協議自己是無狀態的,自己並不能支持服務端保存客戶端的狀態信息,因而,Web Server中引入了session的概念,用來保存客戶端的狀態信息。 數據庫

1)當一個用戶向服務器發送第一個請求時,服務器爲其創建一個session,併爲此session建立一個標識號;

2 ) 這個用戶隨後的全部請求都應包括這個標識號。服務器會校對這個標識號以判斷請求屬於哪一個session。跨域

這種機制不使用IP做爲標識,是由於不少機器是經過代理服務器方式上網,無法區分每一臺機器。數組

對於session標識號(sessionID),有兩種方式實現:cookies和URL重寫。瀏覽器

 

1)URL重寫。 
Web Server在返回Response的時候,檢查頁面中全部的URL,包括全部的鏈接,和HTML Form的Action屬性,在這些URL後面加上「;jsessionid=XXX」。 
下一次,用戶訪問這個頁面中的URL。jsessionid就會傳回到Web Server。安全

2)Cookie。 服務器

若是客戶端支持Cookie,Web Server在返回Response的時候,在Response的Header部分,加入一個「set-cookie: jsessionid=XXXX」header屬性,把jsessionid放在Cookie裏傳到客戶端。 cookie

客戶端會把Cookie存放在本地文件裏,下一次訪問Web Server的時候,再把Cookie的信息放到HTTP Request的「Cookie」header屬性裏面,這樣jsessionid就隨着HTTP Request返回給Web Server。網絡

 

實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,cookies是實現session的一種方式,經過cookies,把sessionID發送給服務器,來實現session。session

 

cookies的主要內容

主要包括:名字,值,過時時間,路徑和域。
路徑、域和做用範圍:其中域能夠指定某一個域好比.google.com,至關於總店招牌,好比寶潔公司,也能夠指定一個域下的具體某臺機器好比www.google.com或者froogle.google.com,能夠用飄柔來作比。
路徑就是跟在域名後面的URL路徑,好比/或者/foo等等,能夠用某飄柔專櫃作比。
路徑與域合在一塊兒就構成了cookie的做用範圍。
過時時間:如 果不設置過時時間,則表示這個cookie的生命期爲瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種 生命期爲瀏覽器會話期的 cookie被稱爲會話cookie會話cookie通常不存儲在硬盤上而是保存在內存裏,固然這種行爲並非規範規定的。若是設置了過時時間,瀏覽器 就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過時時間。
 
 

Cookie的缺陷數據結構

(1)cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。

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

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

 

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

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

二、購物車功能。

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

 
Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據能夠保存在集羣、數據庫、文件中;
Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式
 
 
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僅在他所在的域名內有效。 

 

Cookie的操做:

添加Cookie

Cookie cookie = new Cookie("user", "suntao");
  cookie.setMaxAge(7*24*60*60);     // 一星期有效
  response.addCookie(cookie);

 

獲取Cookie

// 由於取得的是整個網頁做用域的Cookie的值,因此獲得的是個數組
  Cookie[] cookies = request.getCookies();

  for(int i = 0 ; i < cookies.length ; i++){
   String name = cookies[i].getName() ;
    String value = cookies[i].getValue() ;
   }    
相關文章
相關標籤/搜索