apache 设置session超时时间_深入分析 Session 和 Cookie,看这篇就对了
點擊上方 "程序員小樂"關注, 星標或置頂一起成長
第一時間與你相約
每日英文
Promise yourself to be so strong that nothing can disturb your peace of mind.
對自己承諾:我要強大到任何事情都無法破壞我內心的平和。
每日掏心話
每一發奮努力的背后,必是有加倍的賞賜。莫要去找借口失敗,只找理由成功。也許現在你正面臨一些困難,但是你別忘了,生活總是在向前,明天總是會更好。
來自:PatrickLee666 | 責編:樂樂
鏈接:juejin.im/post/5b7c1f4d6fb9a019f221ca14
程序員小樂(ID:study_tech)第 717 次推文 圖片來自網絡往日回顧:你還在傻傻的從零搭建項目 ?看完這篇你就明白了!
正文
為什么需要cookie和session
在Web發展史中,我們知道瀏覽器與服務器間采用的是 http協議,而這種協議是無狀態的,所以這就導致了服務器無法知道是誰在瀏覽網頁,但很明顯,一些網頁需要知道用戶的狀態,例如登陸,購物車等。
所以為了解決這一問題,先后出現了四種技術,分別是隱藏表單域,URL重寫,cookie,session,而用的最多也是比較重要的就是cookie和session了。
Cookie
是什么
cookie是瀏覽器保存在用戶電腦上的一小段文本,通俗的來講就是當一個用戶通過 http訪問到服務器時,服務器會將一些 Key/Value鍵值對返回給客戶端瀏覽器,并給這些數據加上一些限制條件,在條件符合時這個用戶下次訪問這個服務器時,數據通過請求頭又被完整地給帶回服務器,服務器根據這些信息來判斷不同的用戶。
也就是說, cookie是服務器傳給客戶端并保存在客戶端的一段信息,這個 Cookie是有大小,數量限制的!!
Cookie的創建
當前 Cookie有兩個版本,分別對應兩種設置響應頭:“Set-Cookie”和 “Set-Cookie2”。在Servlet中并不支持Set-Cookie2,所以我們來看看Set-Cookie的屬性項:
這些屬性項,其他的都說的很清楚了,我們來看看Domain有什么用:
現在,我們假設這里有兩個域名:
域名A:a.b.f.com.cn 域名B:c.d.f.com.cn
顯然,域名A和域名B都是 f.com.cn的子域名
如果我們在域名A中的Cookie的domain設置為f.com.cn,那么f.com.cn及其子域名都可以獲取這個Cookie,即域名A和域名B都可以獲取這個Cookie
如果域名A和域名B同時設置Cookie的doamin為f.com.cn,那么將出現覆蓋的現象
如果域名A沒有顯式設置Cookie的domain方法,那么domain就為a.b.f.com.cn,不一樣的是,這時,域名A的子域名將無法獲取這個Cookie
好的,現在了解完了Set-Cookie的屬性項,開始創建Cookie
Web服務器通過發送一個稱為Set-Cookie的http消息來創建一個Cookie:
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
這里我們思考一個問題,當我們在服務器創建多個Cookie時,這些Cookie最終是在一個Header項中還是以獨立的Header存在的呢?
我們可以看到,構建http返回字節流時是將Header中所有的項順序寫出,而沒有進行任何修改。所以可以想象在瀏覽器在接收http返回的數據時是分別解析每一個Header項。
接著,在客戶端進行保存,如何保存呢?這里又要對Cookie進行進一步的了解
Cookie的分類
會話級別Cookie:所謂會話級別Cookie,就是在瀏覽器關閉之后Cookie就會失效。
持久級別Cookie:保存在硬盤的Cookie,只要設置了過期時間就是硬盤級別Cookie。
好的,現在cookie保存在了客戶端,當我們去請求一個URL時,瀏覽器會根據這個URL路徑將符合條件的Cookie放在請求頭中傳給服務器。
Session
Cookie是有大小限制和數量限制的,并且越來越多的Cookie代表客戶端和服務器的傳輸量增加,可不可以每次傳的時候不傳所有cookie值,而只傳一個唯一ID,通過這個ID直接在服務器查找用戶信息呢?答案是有的,這就是我們的session。
Session是基于Cookie來工作的,同一個客戶端每次訪問服務器時,只要當瀏覽器在第一次訪問服務器時,服務器設置一個id并保存一些信息(例如登陸就保存用戶信息,視具體情況),并把這個id通過Cookie存到客戶端,客戶端每次和服務器交互時只傳這個id,就可以實現維持瀏覽器和服務器的狀態,而這個ID通常是NAME為JSESSIONID的一個Cookie。
實際上,有四種方式讓Session正常工作:
通過URL傳遞SessionID
通過Cookie傳遞SessionID
通過SSL傳遞SessionID
通過隱藏表單傳遞SessionID
第一種情況:
當瀏覽器不支持Cookie功能時,瀏覽器會將用戶的SessionCookieName(默認為JSESSIONID)重寫到用戶請求的URL參數中。格式:/path/Servlet;name=value;name2=value2?Name3=value3
第三種情況:
會根據javax.servlet.request.ssl_session屬性值設置SessionID。
注:如果客戶端支持Cookie,又通過URL重寫,Tomcat仍然會解析Cookie中的SessionID并覆蓋URL中的SessionID
session工作原理
先看session工作的時序圖
一、創建session
當客戶端訪問到服務器,服務器會為這個客戶端通過request.getSession()方法創建一個Session,如果當前SessionID還沒有對應的HttpSession對象,就創建一個新的,并添加到org.apache.catalina.Manager的sessions容器中保存,這就做到了對狀態的保持。當然,這個SessionID是唯一的
二、session保存
由圖可知,session對象已經保存在了Manager類中,StandardManager作為實現類,通過requestedSessionId從StandardManager的sessions集合中取出StandardSession對象。
我們來看看StandardManager時如何對所有StandardSession對象進行生命周期管理
當Servlet容器關閉:
StandardManager將持久化沒過期的StandardSession對象(必須調用Servlet容器中的stop和start命令,不能直接kill)
當Servlet容器重啟時:
StandardManager初始化會重讀這個文件,解析出所有session對象。
三、session的銷毀
這里有一個誤區,也是我之前的錯誤理解,就是我將session的生命周期理解成一次會話,瀏覽器打開就創建,瀏覽器關閉就銷毀,這樣理解是錯的!!
session的聲明周期是從創建到超時過期
也就是說,當session創建后,瀏覽器關閉,會話級別的Cookie被銷毀,如果沒有超過設定時間,該SessionID對應的session是沒有被銷毀的,
檢查session失效
檢查每個Session是否失效是在Tomcat的一個后臺線程完成的(backgroundProcess()方法中);除了后臺進程檢驗session是否失效外,調用request.getSession()也會檢查該session是否過期,當然,調用這種方法如果過期的話又會重新創建一個新的session。
小結
二者的異同
相同點(有關系的地方):
Session和Cookie都是為了讓http協議又狀態而存在
Session通過Cookie工作,Cookie傳輸的SessionID讓Session知道這個客戶端到底是誰
不同點:
Session將信息保存到服務器,Cookie將信息保存在客戶端
工作流程
當瀏覽器第一次訪問服務器時,服務器創建Session并將SessionID通過Cookie帶給瀏覽器保存在客戶端,同時服務器根據業務邏輯保存相應的客戶端信息保存在session中;客戶端再訪問時上傳Cookie,服務器得到Cookie后獲取里面的SessionID,來維持狀態。
歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。
猜你還想看
阿里、騰訊、百度、華為、京東最新面試題匯集
Linux 系統 CPU 100% 異常排查實踐與總結
動畫演繹Java常用數據結構(建議收藏)
記錄自己理解的一些設計模式
關注「程序員小樂」,收看更多精彩內容
嘿,你在看嗎?
總結
以上是生活随笔為你收集整理的apache 设置session超时时间_深入分析 Session 和 Cookie,看这篇就对了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器的发展历程,盘点微软Azure云
- 下一篇: 如何用js给图片重置宽_如何用js给老婆