session分析

来源:https://www.cnblogs.com/diexian/archive/2019/01/17/10284635.html
-Advertisement-
Play Games

因為http,https是無狀態的,也就是當我們連續兩次訪問同一個web網站,網站是無法分辨這兩次訪問是來自同一個人。對於它來說,這兩次訪問是沒有關係的。 就像是,我們進入了澡堂洗澡,中途要從入口出來接電話,可是當我們再次進去的時候,人家就不認識你了,還管著問你要貴賓卡呢!那麼怎麼讓這個門口迎賓能認 ...


一:為什麼需要session

   因為http,https是無狀態的,也就是當我們連續兩次訪問同一個web網站,網站是無法分辨這兩次訪問是來自同一個人。對於它來說,這兩次訪問是沒有關係的。

就像是,我們進入了澡堂洗澡,中途要從入口出來接電話,可是當我們再次進去的時候,人家就不認識你了,還管著問你要貴賓卡呢!那麼怎麼讓這個門口迎賓能認出你是VIP呢?

答案當然是VIP的卡嘛!就類似於令牌。每次進澡堂子就分配一個。這樣不管你中途出來接多少次電話,只要這VIP卡不過期,人家都會對你客客氣氣,讓你有一種賓至如歸的感覺!

所以我們知道session的第一個作用是令牌,讓網站記住我們的訪問。

           如果你覺得session的作用只有這樣,那你就太天真了!我們還是從去澡堂子聊起。去過澡堂子的人都知道,我們是穿著衣服去澡堂子的,還會有手機,沒準身份證什麼的。這些東西都得有地方存放!

那這時候我們的貴賓卡就起到作用了,一般澡堂子都會有一個跟卡對應的柜子,可以用卡刷開。這個柜子可以放我們所有的個人物品。那麼聰明的你,是不是想到了session之於網站的相似功能呢?沒錯,

session在我們登錄之後,就可以手動存放你所有想放入的一切。包括用戶的基本信息,許可權等。(但是切忌不要存太多東西,畢竟澡堂子的柜子都不會太大,也不會太多!太大,太多會把澡堂子撐爆的!)。

那麼這個存放東西的柜子在web網站的哪裡呢?答案是web網站的記憶體中。這個存取需要你手動進行。所以,你就知道了session的第二個作用是,存東西

二:session的作用原理

  當我們的請求到達自伺服器的時候,伺服器並不一定為我們分配session。只有當我們顯式調用getSession()或者getSession(true)才會真的產生。因為伺服器保存session是需要開銷的,只有當你真的

顯示去調用這個方法,伺服器才知道你有這個需求。但是很多情況下我們似乎並沒有顯式去調用這個方法,卻能看到cookie這個請求頭中有jsessionid,這是為什麼呢?你們有沒有發現,我們的jsp頭部會預設有

一個session=true的屬性?有這個屬性後,伺服器將jsp轉為servlet後,裡面就會有顯式的調用這個方法,所以也同樣會產生session。

       上面說了產生session的時機,那麼當顯式調用後,伺服器就會生成一個按照'隨機數+時間+jvmid'的規則生成的sessionId,tomcat伺服器中叫jsessionId。併在伺服器記憶體中開闢一個記憶體區域,與這個sessionId對應。

sessionId是這個記憶體區域唯一的存取憑證。

       那麼session到底是一個什麼樣的數據結構呢?相信聰明的你,通過根據sessionId去獲取session就會猜想session的結構是一個MAP.事實確實如此,session的數據結構是ConcurrentHashMap<String,ConcurrentHashMap<String,Object>>

ConcurrentHashMap保存它的併發安全性。而裡面一層的Map則是某個用戶的多個session級屬性。

        那麼session是如何使用呢?當我們伺服器生成一個session和sessionId後,就會通過一個set-Cookie的Header,通知瀏覽器你要在用戶本地創建一個cookie.用來保存這個sessionId.這個Header中還包括path和httpOnly,過期時間(預設是-1,表示

一個會話期)。瀏覽器保存這個sessionId的Cookie後,後面的每次請求,瀏覽器都會自動去將這個cookie設置到請求頭中,那麼伺服器接收到請求後,就會說“哦,老熟人又來了”。這個ssesionId能獲取到對應的session。也就能知道前面操作留下的數據。

         那麼伺服器的這個session什麼時候會消失呢?很多人可能會猜想一個貌似完美的方案,當瀏覽器關閉後,session就會消失?但是事實是不可能的!因為我們知道,不可能關閉瀏覽器後,就去觸發一個請求去通知瀏覽器,調用session的過期或者

刪除方法。這樣就將瀏覽器和伺服器強烈耦合在一起!另外一個合理的做法是,當瀏覽器關閉後,意味著一個會話期滿後,瀏覽器之前創建的Cookie就會失效。這時候再打開瀏覽器,它是不會再在請求中附上之前那個sessionId的,所以儘管這個時候這個session可能還

存在,但是沒有沒有sessionId這個憑證來操作它了!那麼session都會有一個過期時間。這個都是可配的,一般在web.xml中。那麼如果一個session的最後操作時間距離某個時間點,中間的時間間隔恰好是>=那個過期時間,那麼當檢查進行時,就會銷毀這個session。

三,session機制存在的問題

       第一個,session劫持:大家在上面可能會發現,sessionId這個憑證,是保存在用戶本地的。那麼如果一旦被別人找到並複製了這個憑證,就意味著他也能獲取伺服器的認證,能獲取到伺服器上你存放的東西了!著就像是好萊塢大片里經常

出現的特工冒用別人身份的橋段。

     第二個,Cookie禁用問題:session的憑證,就是依靠瀏覽器的cookie,一旦用戶在本地禁用cookie,那麼這個令牌就沒有了,意味了伺服器存放的東西,永遠沒有人來領取。

    第三個,session的分散式問題:現在的數據都是幾何級增長,系統都是分散式架構。如果一個前端系統有A,B兩台。那麼當用戶訪問A系統,A系統給他分配了一個session,並給他一個令牌,那麼當他下次再去訪問B系統時,帶著這個令牌,傳統的session就會

出現問題。因為令牌是A系統頒給他的,B系統並不認識。

   以上3個問題大多都是有解決辦法的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、問題描述 Tomcat下麵部署很多個java項目的war包,tomcat啟動一段時間後,發現cpu占用過高,整個界面卡死! 二、通過process explorer查看java進程下的線程 process explorer是Windows系統和應用程式監視工具。 process explorer ...
  • 字元串,是Java中最重要的類。這句肯定的推斷不是Java之父詹姆斯·高斯林說的,而是沉默王二說的,因此你不必懷疑它的準確性。 關於字元串,有很多的面試題,但我總覺得理論知識繞來繞去沒多大意思。你比如說:String cmower = new String("沉默王二");定義了幾個對象? 我總覺得 ...
  • 首先嘗試網友們的方法 按照網上大部分的教程仍無法解決自己的問題,不管是更改.project文件還是使用其他修改配置的方法,始終不能解決問題。 嘗試自己解決問題 想到了可能是eclipse版本的問題,我之前使用的是eclipse mars版本。我隨即去官網下載了最新版本的eclipse。下載後導入項目 ...
  • 背景:併發知識是一個程式員段位升級的體現,同樣也是進入BAT的必經之路,有必要把併發知識重新梳理一遍。 說到併發concurrent,肯定首先想到了線程,創建線程有兩種方法:1、從Java.lang.Thread類派生一個新的線程類,重載它的run()方法;2、實現Runnalbe介面,重載Runn ...
  • 本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。 ...
  • Shell是一個命令解釋器。它不僅是操作系統內核與用戶之間的絕緣層,同時也是一種功能相當強大的編程語言。一個Shell程式,通常稱為腳本,它是一個由系統調用,命令工具,軟體包和已編譯的二進位包"粘合" 起來的極易使用的工具。事實上,整個UNIX系統命令,軟體包和工具都能由一個shell腳本調用。如果 ...
  • 一、文件處理基本形式 二、打開文件的模式 三、操作文件的方法 ...
  • 哈哈,其實很簡單,寥寥幾行代碼網頁爬一部小說,不賣關子,立刻開始。 首先安裝所需的包,requests,BeautifulSoup4 控制台執行 pip install requests pip install BeautifulSoup4 如果不能正確安裝,請檢查你的環境變數,至於環境變數配置,在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...