1.爲何要有cookie/session?
在客戶端瀏覽器向服務器發送請求,服務器作出響應以後,兩者便會斷開鏈接(一次會話結束)。那麼下次用戶再來請求服務器,服務器沒有任何辦法去識別此用戶是誰。好比web系統經常使用的用戶登陸功能,若是沒有cookie機制支持,那麼只能經過查詢數據庫實現,而且要命的是每次刷新頁面都要從新輸入表單信息查詢一次數據庫才能夠識別用戶,這會給開發人員帶來大量冗餘工做而且簡單的用戶登陸功能會給服務器帶來巨大的壓力。web
在此背景下,就急需一種機制來解決此問題。分析可知,以上需求的實現就要客戶端每次訪問服務器時從客戶端帶上一些數據(至關於身份證)告知服務器本身是誰。這個數據就是cookie!而且客戶端訪問服務器時不能將全部cookie都帶過去,好比訪問百度就不能把谷歌的cookie帶給百度,這個設置方式在後面介紹。數據庫
那麼有了cookie,爲何還要有session呢?有了cookie能夠向服務器證實用戶身份了,咱們的web系統中是否是須要將用戶的詳細信息儲存在某個位置供頁面調用呢?用戶的詳細信息就包括姓名,年齡,性別等信息。而cookie是存在於客戶端的,將用戶詳細信息經過網絡發送到客戶端保存是極不安全的。且cookie大小不能超過4k,不能支持中文。這就限制cookie不能知足存儲用戶信息的需求。這就須要一種機制在服務器端的某個域中存儲一些數據,這個域就是session。api
總而言之,cookie/session的出現就是爲了解決http協議無狀態的弊端,爲了讓客戶端和服務端創建長久聯繫而出現的。瀏覽器
2.什麼是會話技術?
幫你存儲一些在交互過程臨時產生的數據tomcat
當你打開瀏覽器,訪問一個網站,認爲會話開始了,當你關閉瀏覽器的時候,會話結束了安全
3.cookie/session執行流程(這纔是重點)
cookie執行流程服務器
當你去訪問應用的時候,來到服務器。服務器設置一個cookie(後邊介紹api),在作響應的時候會經過set-cookie響應頭將cookie帶給瀏覽器。cookie
來到瀏覽器,瀏覽器會將此數據保存起來,接下來再次去訪問服務器的時候,瀏覽器會根據cookie的path屬性(後邊api介紹)將這些數據帶回去(設置了一個叫作cookie的請求頭),來到服務器,服務器有對應的api獲取這些值,有了值就知道用戶是誰了。網絡
session執行流程session
瀏覽器發起一個請求到服務器,服務器先檢查你是否攜帶了一個叫作JSESSIONID的cookie。
若是有攜帶,會將此cookie的值取出來(好比爲aaa123),而後從服務器的session池中找到ID爲aaa123的session返回給調用者。
若是沒有攜帶這個JSESSIONID的cookie,那麼服務器將會自動建立一個session對象而且生成一個隨機字符串(如aaa123)做爲此session的ID保存到session池中。在服務器爲客戶端瀏覽器做響應的時候自動建立一個鍵爲「JSESSIONID」 值爲「aaa123」的cookie對象讓瀏覽器儲存起來以便下次再訪問的時候帶過來。
4.cookie的經常使用屬性api
Cookie cookie = new Cookie("name","tom"); // 新建Cookie
cookie就是鍵值對的數據,若是是中文不能直接設置,須要編碼
cookie.setDomain("www.baidu.com"); // 設置域名
這樣設置域名的話,該cookie會被提交到www.baidu.com可是不會被提交到zhidao.baidu.com。要想都提交過去,須要這樣設置cookie.setDomain(".baidu.com");
cookie.setPath("/search"); // 設置路徑
這樣設置路徑,該cookie只會被提交到www.baidu.com/search路徑下的頁面,也就是說在www.baidu.com/aaa下的頁面是獲取不到該cookie的。通常cookie在某個網站裏都是可用的,直接設置爲/,cookie.setPath("/");
cookie.setMaxAge(60*60*24*7); // 設置有效期
MaxAge屬性單位爲秒,默認爲-1也就是關閉瀏覽器自動銷燬。cookie.setMaxAge(60*60*24*7); 這樣設置意思是無論瀏覽器關閉與否,將此cookie持久化到客戶端文件裏保存一週。參數爲正數時瀏覽器都會將相應的cookie作持久化處理。
response.addCookie(cookie); // 輸出到客戶端
5.session經常使用api
HttpSession session = request.getSession(); // 建立session
session.setAttribute("name","tom"); // 設置Session屬性
out.println("歡迎您:" +session.getAttribute("name")); // 獲取Session屬性
在tomcat配置文件中配置session的超時時間
<session-config>
<session-timeout>分鐘爲單位</session-timeout>
</session-config>
6.cookie/session的區別與聯繫
區別:
1.cookie存放在客戶端,session存放在服務器端。
2.cookie只能存放4k的數據,而session理論上沒有作限制
聯繫:
session雖然說存放在服務器端,可是仔細看剛纔的執行流程你會明白,session是依賴於cookie的,這一點也是本篇文章想要着重強調的
7.cookie/session使用注意事項
1.cookie大小有限制 4k
2.cookie不能跨瀏覽器
3.cookie不支持中文
4.若是是安全性較高的數據應存放在session中,由於cookie存放在客戶端總會輕易被不法分子獲取
5.若是是訪問量特別大的網站,儘可能不要在session中存儲用戶數據,由於每一個用戶存一個session會給服務器形成很大的壓力
8.新手使用session時常踩的坑
不少人使用session時但願用戶信息能夠保存一段時間好比保存7天,因而配置了Tomcat的
<session-config>
<session-timeout>7天</session-timeout>
</session-config>。
配置完後發現,關閉瀏覽器後再訪問仍是取不到session。這是由於session的配置沒起做用嗎?不是的,其實session仍是存在於服務器的,只是沒有設置cookie持久化,cookie默認就會在瀏覽器關閉時銷燬,因此叫作JSESSIONID的cookie也被銷燬了,再到服務器的時候沒有這個叫JSESSIONID的cookie就取不到相關的session了。
因此,若是想7天內都能訪問到session,須要將cookie也設置持久化!