這裏是修真院後端小課堂,每篇分享文從html
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】程序員
八個方面深度解析後端知識/技能,本篇分享的是:web
【什麼是session?什麼是cookie?session和cookie有什麼區別?什麼場景適用於session?什麼場景適用於cookie?】redis
【修真院JAVA小課堂】 什麼是session?什麼是cookie?session和cookie有什麼區別?什麼場景適用於session?什麼場景適用於cookie?數據庫
你們好,我是IT修真院西安分院第四期的學員趙立鼐,一枚正直純潔善良的JAVA程序員,今天給你們分享一下,修真院官網JAVA任務五,深度思考中的知識點——session和cookie後端
(1)背景介紹:瀏覽器
HTTP的無狀態性緩存
HTTP 是一種不保存狀態,無狀態(stateless)協議。tomcat
HTTP 協議自身不對請求和響應之間的通訊狀態進行保存。也就是說在 HTTP 這個級別,協議對於發送過的請求或響應都不作持久化處理。使用 HTTP 協議,每當有新的請求發送時,就會有對應的新響應產生。協議自己並不保留以前一切的請求或響應報文的信息。服務器
這是爲了更快地處理大量事務,確保協議的可伸縮性,而特地把 HTTP 協議設計成如此簡單的。
隨着 Web 的不斷髮展,無狀態而致使業務處理變得棘手的狀況增多了。好比,用戶登陸到一家購物網站,即便他跳轉到該站的其餘頁面後,也須要能繼續保持登陸狀態。針對這個實例,網站爲了可以掌握是誰送出的請求,須要保存用戶的狀態。
HTTP/1.1 雖然是無狀態協議,但爲了實現指望的保持狀態功能,因而引入了 Cookie 技術。有了 Cookie 再用 HTTP 協議通訊,就能夠管理狀態了。
(2)知識剖析:
什麼是Session
Session表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。
Session是一種服務器端的機制,Session 對象用來存儲特定用戶會話所需的信息。
Session由服務端生成,保存在服務器的內存、緩存、硬盤或數據庫中。
對Tomcat而言,Session是一塊在服務器開闢的內存空間,其存儲結構爲
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,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器。
什麼是cookie?
因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。
Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。
(3)常見問題:
sessionid如何產生?由誰產生?保存在哪裏?
(4)解決方案:
反 sessionid是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應。
tomcat生成的sessionid叫作jsessionid。
存儲在服務器的內存中,tomcat的StandardManager類將session存儲在內存中,也能夠持久化到file,數據庫,memcache,redis等。客戶端只保存sessionid到cookie中,而不會保存session,session銷燬只能經過invalidate或超時,關掉瀏覽器並不會關閉session。
(5)編碼實戰:
儘量的去尋找在真實項目中在用的。若是你能找到某個網站在用你說的知識點,這是最好的。學以至用,不然當成練習題就沒有意義了。多準備一些demo,講解過程當中將知識點和demo結合,便於你們理解所講解的知識點。
(6)拓展思考:
session和cookie有什麼區別?
Cookie與Session都可以進行會話跟蹤,可是完成的原理不太同樣。普通情況下兩者均可以知足需求,但有時不可以運用Cookie,有時不可以運用Session。下面通過比擬闡明二者的特性以及適用的場所:
1.存取方式的不一樣
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進制數據,需求先進行編碼。Cookie中也不能直接存取Java對象。若要存儲略微複雜的信息,運用Cookie是比較艱難的.
而Session中可以存取任何類型的數據,包括而不限於String、Integer、List、Map等。Session中也可以直接保管JavaBean乃至任何Java類,對象等,運用起來十分便當。可以把Session看作是一個Java容器類。
2.隱私策略的不一樣
Cookie存儲在客戶端閱讀器中,對客戶端是可見的,客戶端的一些程序可能會窺探、複製以致修正Cookie中的內容。而Session存儲在服務器上,對客戶端是透明的,不存在敏感信息泄露的風險。
假如選用Cookie,比較好的方法是,敏感的信息如帳號密碼等儘可能不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務器後再進行解密,保證Cookie中的信息只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在服務器上,Session裏任何隱私都可以有效的保護。
3.有效期上的不一樣
使用過Google的人都曉得,假如登陸過Google,則Google的登陸信息長期有效。用戶不用每次訪問都從新登陸,Google會持久地記載該用戶的登陸信息。要到達這種效果,運用Cookie會是比較好的選擇。只須要設置Cookie的過時時間屬性爲一個很大很大的數字。
因爲Session依賴於名爲JSESSIONID的Cookie,而CookieJSESSIONID的過時時間默許爲–1,只需關閉了閱讀器該Session就會失效,於是Session不能完成信息永世有效的效果。運用URL地址重寫也不能完成。並且假如設置Session的超時時間過長,服務器累計的Session就會越多,越容易招致內存溢出。
4.服務器壓力的不一樣
Session是保管在服務器端的,每一個用戶都會產生一個Session。假如併發訪問的用戶十分多,會產生十分多的Session,耗費大量的內存。於是像Google、Baidu、Sina這樣併發訪問量極高的網站,是不太可能運用Session來追蹤客戶會話的。而Cookie保管在客戶端,不佔用服務器資源。假如併發使用的用戶十分多,Cookie是很好的選擇。關於Google、Baidu、Sina來講,Cookie或許是惟一的選擇。
(7)參考文獻:
https://www.cnblogs.com/aspwe...
(8)更多討論:
Q1:魯伯良: 一、服務器如何判斷客戶端發送過來的請求是屬於同一個會話?
用Session id區分,Session id相同的即認爲是同一個會話,在Tomcat中Session id用JSESSIONID表示;
Q2:劉優:二、服務器、客戶端如何獲取Session id?Session id在其之間是如何傳輸的呢?
A2: 趙立鼐 :服務器第一次接收到請求時,開闢了一塊Session空間(建立了Session對象),同時生成一個Session id,並經過響應頭的Set-Cookie:「JSESSIONID=XXXXXXX」命令,向客戶端發送要求設置cookie的響應;
客戶端收到響應後,在本機客戶端設置了一個JSESSIONID=XXXXXXX的cookie信息,該cookie的過時時間爲瀏覽器會話結束;
接下來客戶端每次向同一個網站發送請求時,請求頭都會帶上該cookie信息(包含Session id);
而後,服務器經過讀取請求頭中的Cookie信息,獲取名稱爲JSESSIONID的值,獲得這次請求的Session id;
ps:服務器只會在客戶端第一次請求響應的時候,在響應頭上添加Set-Cookie:「JSESSIONID=XXXXXXX」信息,接下來在同一個會話的第二第三次響應頭裏,是不會添加Set-Cookie:「JSESSIONID=XXXXXXX」信息的;
而客戶端是會在每次請求頭的cookie中帶上JSESSIONID信息;
Q3:秦永輝: 三、 session產生的session_id放在cookie裏面,若是用戶把cookie禁止掉,是否是session也不能用了呢?
A3: 趙立鼐: 禁止掉cookie後,session固然能夠用,不過經過其餘的方式來得到這個sessionid,好比,能夠跟在url的後面,或者以表單的形勢提交到服務器端。從而使服務器端了解客戶端的狀態。
(9)鳴謝:
感謝劉優師兄,此教程是在他們以前技術分享的基礎上完善而成。
(10)結束語:
今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚~