1.第一點想要了解一樣技術必須了解它的哲學,也就是這項技術是為了解決什么問題而誕生的它存在的意義是什么?
因為HTTP是無連接的,當請求結束連接就會中斷所以會產生身份識別的問題。
因此誕生了cookie甚至於在localStorage出現之前瀏覽器存儲功能都是依靠cookie來完成的
但是它的原理簡單到爆,一句話就是當瀏覽器訪問服務器時,服務器會向瀏覽器發送一個cookie
可以理解為標識符,下次瀏覽器再向服務器發送請求時在上行報文中攜帶這個標識符(cookie)
服務器就能夠根據標識符做出識別,當服務器在下行報文中設置kookie的持續時間
那么瀏覽器在一定時間內訪問該服務器都會攜帶這個cookie,kookie的本意是曲奇,老外喜歡拿餅干做信物
所以kookie就是一個瀏覽器跟服務器通訊的信物,如果是中國人發明可能就是黑話,這個基礎是建立在HTTP無連接
那么有了cookie,為什么還要有session呢?有了cookie可以向服務器證明用戶身份了,我們的web系統中是不是需要將用戶的詳細信息儲存在某個位置供頁面調用呢?用戶的詳細信息就包括姓名,年齡,性別等信息。而cookie是存在於客戶端的,將用戶詳細信息通過網絡發送到客戶端保存是極不安全的。且cookie大小不能超過4k,不能支持中文。這就限制cookie不能滿足存儲用戶信息的需求。這就需要一種機制在服務器端的某個域中存儲一些數據,這個域就是session。
總而言之,cookie/session的出現就是為了解決http協議無狀態的弊端,為了讓客戶端和服務端建立長久聯系而出現的。
2.什么是會話技術?
幫你存儲一些在交互過程臨時產生的數據
當你打開瀏覽器,訪問一個網站,認為會話開始了,當你關閉瀏覽器的時候,會話結束了
3.cookie/session執行流程(這才是重點)
cookie執行流程
當你去訪問應用的時候,來到服務器。服務器設置一個cookie(后邊介紹api),在做響應的時候會通過set-cookie響應頭將cookie帶給瀏覽器。
來到瀏覽器,瀏覽器會將此數據保存起來,接下來再次去訪問服務器的時候,瀏覽器會根據cookie的path屬性(后邊api介紹)將這些數據帶回去(設置了一個叫做cookie的請求頭),來到服務器,服務器有對應的api獲取這些值,有了值就知道用戶是誰了。
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也設置持久化!
————————————————
版權聲明:本文為CSDN博主「IT_zhang81」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/IT_zhang81/article/details/81776956