1. HTTP是無狀態協議?
HTTP無狀態協議,是指協議對於事務處理沒有記憶能力。同一個客戶端的此次請求和上次請求是沒有對應關係,對http服務器來講,它並不知道這兩個請求來自同一個客戶端。
無狀態,意味着若是後續處理須要前面的信息,則它必須重傳。這樣可能致使每次鏈接傳送的數據量增大。可是另外一方面,在服務器不須要先前信息時它的應答就較快。
所以在web應用開發裏就出現了保持http狀態的技術:一個是cookie技術,另外一種是session技術。web
2. 什麼是Cookie?
Cookie其實是一小段的文本信息。
客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,客戶端瀏覽器會把Cookie保存起來。
當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。
服務器還能夠根據須要修改Cookie的內容。Cookie的內容主要包括:名字,值,過時時間,路徑和域。redis
3. 服務端怎麼向客戶端頒發Cookie?
客戶端第一次請求服務器的時候,服務器的響應頭中會有一個 Set-Cookie: JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;。
Set-Cookie由服務器發送,它包含在響應體的頭部中。它用於在客戶端建立或更新Cookie。算法
4. 客戶端怎麼攜帶着Cookie訪問服務器?
客戶端發送請求時會自動在請求頭上添加:Cookie:JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;(客戶端第一次拿到的SessionID)
只有cookie的domain和path與請求的URL匹配纔會發送這個cookie。瀏覽器
5. 什麼是Session?
客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。緩存
6. Session在什麼時候建立?
在服務器端程序運行的過程當中建立的。在Java中是經過調用HttpServletRequest的getSession(true)方法建立的。
在建立了Session的同時,服務器會爲該Session生成惟一的SessionId,而這個SessionId在隨後的請求中會被用來從新得到已經建立的Session。
session的實現機制都是web容器裏內部機制。服務器
7. 會話是怎麼保持的?
在Session被建立以後,就能夠調用Session相關的方法往Session中增長內容了,而這些內容只會保存在服務器中,發到客戶端的只有SessionId。
當客戶端再次發送請求的時候,會將這個SessionId帶上,服務器接受到請求以後就會依據SessionId找到相應的Session,從而再次使用之。正式這樣一個過程,用戶的狀態也就得以保持了。cookie
8. Session在何時刪除?
超時;程序調用HttpSession.invalidate();程序關閉;session
9. Session存放在哪裏?
通常存放在服務器端的內存中。不過session能夠經過特殊的方式作持久化管理(memcache,redis)。dom
10. Session的id是從哪裏來的?
當客戶端第一次請求session對象時候,服務器會爲客戶端建立一個session,並將經過特殊算法算出一個session的ID,用來標識該session對象網站
11. Session會由於瀏覽器的關閉而刪除嗎?
不會,Session只會經過上面提到的方式去關閉。
瀏覽器關閉只是把sessionId給清除了,因此再次打開瀏覽器並請求服務器,你的登陸狀態沒法找到,所以你須要從新登陸。
通常狀況下,瀏覽器若是不刷新或者不從新請求的話,服務器通常會緩存session數據20分鐘左右