HTTP協議自己是無狀態的,自己並不能支持服務端保存客戶端的狀態信息,因而,Web Server中引入了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
Cookie的缺陷數據結構
(1)cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。
(2)因爲在HTTP請求中的cookie是明文傳遞的,因此安全性成問題。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右。對於複雜的存儲需求來講是不夠用的。
Cookie的根本做用就是在客戶端存儲用戶訪問網站的一些信息。典型的應用有:
一、記住密碼,下次自動登陸。
二、購物車功能。
三、記錄用戶瀏覽數據,進行商品(廣告)推薦。
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 = 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() ; }