session與cookie引發的一個小故事

2020-12-20 泰戈聊生活

今天在公司加班,突然心血來潮想看看公司一款產品的後管平臺登錄圖片驗證碼是如何實現的,發現用的方案就是session。首先加載頁面時去得到驗證碼,後臺將驗證碼數字存入到session中,然後在登陸時把前端傳入的驗證碼數字同後臺取出的碼進行比較,比較之前首先把原來的session移除掉。若相同則驗證通過,不同則驗證不通過然後重新請求。這個流程本來是沒有什麼問題的,然而自己突然想到這裡會不會有點問題呢?session在並發時會不會出現覆蓋的情況呢?然後就動手開始測試。

首先,使用谷歌瀏覽器在登陸頁面A複製一個登陸頁面B出來,此時就出現問題了,由於B頁面的出現原先的session值已經被覆蓋掉了,此時A頁面輸入驗證碼後就會提示驗證碼錯誤。此時就在想能不能通過新的方案來解決這個問題。既然覆蓋的原因是因為session的key相同造成的,那我能不能使用不同的key,那不就行了嗎?這時很自然的想到了使用cookie,用cookie來保存一個隨機數,每次請求驗證碼時候設置一個隨機數存入cookie,同時session的key就是用這個隨機數,並給cookie設置了個過期時間。由於cookie可以覆蓋,所以不用擔心同一時間,大量的請求問題。

代碼完成後,便開始測試,然而並不是想的那麼順利,此時出現了一個困擾了我幾個小時的問題。每次瀏覽器請求時都被寫入cookie,可為什麼在登陸時就不帶上cookie呢?查了各種資料,甚至在java後臺那裡把請求頭no-cache注釋掉,都沒解決。都快要放棄時,然後突然發現,JSSESSIONID的路徑為什麼和COOKIE的路徑不一樣呢?然後查了一些路徑方面的資料,終於發現是這個原因了。然後再試試問題就解決了,真是坑了我好久。

然後我又突然想到,session是線程安全的嗎,會不會存在著覆蓋的情況。仔細分析後發現是安全的,我同時打開谷歌、火狐瀏覽器,然後使用不同的用戶登錄系統,發現並沒有出現session裡用戶名被覆蓋的情況,原因原來是JSSESSION這個東西,JSSESSIONID表示一個會話,這個會話維護著自己的session,所以不會出現覆蓋的情況。這同時也解釋了為什麼我最初時也就是沒有改驗證碼情況之前,通過兩個瀏覽器不會出現驗證碼被覆蓋的情況。如果通過同一個瀏覽器來登陸不同用戶的話,就會出現用戶被覆蓋的情況,相比原因大家也都知道,那就是JSSESSIONID是一致造成的。

用了將近一天的時間弄明白了這個問題,同時也對session和cookie的原理有了更加深入的了解。學習技術就應該孜孜不倦,任何異常的產生都是有原因的,解決這個異常的過程雖然很艱難,但是隨著不斷地深入你會學到很多很多。

相關焦點

  • 淺談Cookie與Session技術
    一、什麼是狀態管理將客戶端與伺服器之間多次交互當做一個整體來看,並且將多次交互所涉及的數據(狀態)保存下來。會話:當用戶打開瀏覽器,訪問多個WEB資源,然後關閉瀏覽器的過程,稱之為一個會話,選項卡,彈出頁面都屬於這個會話,且共享同一個session。
  • 關於Cookie與session會話技術的示例
    Cookie是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的數據去。這樣,web資源處理的就是用戶各自的數據了(Cookie翻譯成中文是小甜點,小餅乾的意思。
  • Cookie、Session、Token那點事兒
    在這裡引用別人家的一個小故事來加深印象:在說session是啥之前,我們先來說說為什麼會出現session會話,它出現的機理是什麼?所以正是這種訴求,這個時候,一個新的客戶端存儲數據方式出現了:cookie。cookie是把少量的信息存儲在用戶自己的電腦上,它在一個域名下是一個全局的,只要設置它的存儲路徑在域名下 ,那麼當用戶用瀏覽器訪問時,php就可以從這個域名的任意頁面讀取cookie中的信息。所以就很好的解決了我在頁面登陸了,我也可以在獲取到這個登陸信息了。
  • 一篇理解cookie、session、localStorage和sessionStorage
    試題6: 在chrome上登陸的cookie,safari會帶上cookie嗎?解決上面6個問題,首先要依此了解cookie、session、localStorage和sessionStorage的各個用法:1. Cookie是伺服器發送到用戶瀏覽器並保存在本地的一小塊數據。2.
  • session和cookie魅力所在
    1. session概念:現階段的網站要求軟體對一個事務處理要有一個記憶功能,也就是常說的狀態。實現Web應用的技術核心http協議是一個無狀態的協,為了讓Web應用開發保持狀態,就出現了保持http連結的狀態的兩種技術:一個是cookie技術,另一個是session技術。
  • 會話技術 Cookie和Session
    能    如果把cookie的路徑設置為:localhost/day06 說明day06下面的所有資源都可以訪問這個cookie      age:設置cookie的緩存時間。默認的時間是一個負數(瀏覽器關閉時刪除)。如果是0,則是刪除該cookie。正整數才是存活的時間。
  • 面試題: 聊聊 session 和 cookie 的區別
    Cookie通過在客戶端記錄信息確定用戶身份,Session通過在伺服器端記錄信息確定用戶身份Cookie什麼是 Cookiecookie 是瀏覽器保存在用戶電腦上的一小段文本通俗的來講就是當一個用戶通過 http 訪問到伺服器時,伺服器會將一些 Key/Value 鍵值對返回給客戶端瀏覽器
  • Cookie, Session, Token,WebStorage你懂多少?
    面試的時候經常喜歡問一個問題,HTTP協議是有狀態的還是無狀態的?很多同學都不知道,或者簡單背一個答案,曰無狀態.再問,那麼HTTP協議如何保持狀態?只有一小部分同學能答出來要用cookie和session.再問,有了cookie為什麼還要session?更少一部分人能答出來安全。再問,不要cookie行不行?能答出URL重寫的已經不錯了。
  • 淺談cookie,sessionStorage,localStorage
    Session StorageIndexedDBWebSQL (被廢棄)CookieCookie 就是用來在本地緩存記住一些狀態的,一個優點,缺點和瀏覽器支持和 Local Storage 一樣sessionStorage、localStorage、cookie都是在瀏覽器端存儲的數據,其中sessionStorage的概念很特別,引入了一個「
  • cookie和session原來還有這樣的關係
    那麼問題來了,我怎麼登錄,登錄成功後,刷新下,伺服器就不認識我了,不展示我的信息了,這怎麼能行,於是cookie就產生了,cookie是存在客戶端的,最常見的就是瀏覽器了,你第一次訪問頁面的時候,伺服器會返回個cookie給你,這個cookie其實就是sessionId,並存於客戶端,第二次的時候,你刷新頁面的時候,瀏覽器就會帶上之前的cookie,cookie就像通行證,每人一個,無論誰訪問都必須攜帶自己通行證
  • PHP技巧:關於cookie和session的分析
    a) 伺服器通過隨著響應發送一個http的Set-Cookie頭,在客戶機中設置一個cookie(多個cookie要多個頭). b) 客戶端自動向伺服器端發送一個http的cookie頭,伺服器接收讀取.
  • session原理終極版-一文弄懂session會話與cookie 秒殺CSDN
    首先我們來看一下瀏覽器保存的cookie長什麼樣子。通過任意抓包工具,抓取一個需要登錄的網站的cookie,如下圖:session有兩種傳遞方式:第一種通過cookies實現。第二種通過URL重寫來實現。我們先來說說第一種,也是應用最廣泛的。當你第一次訪問當前網站的時候,一個session就被第一次啟用,一個唯一標誌被存儲在本地的cookie中。
  • Cookie、Session、Token講解
    既然Web伺服器記不住東西,那麼我們就在外部想辦法記住,相當於伺服器給每個客戶端都貼上了一個小紙條。上面記錄了伺服器給我們返回的一些信息。然後伺服器看到這張小紙條就知道我們是誰了。那麼Cookie是誰產生的呢?Cookies是由伺服器產生的。
  • 一篇故事看懂從 session-cookie 到 JWT 的技術演變
    怎麼沒聽過這號人物」「我也沒見過,等等看吧」session-cookie時代到底是什麼問題,讓我們兄弟幾個如此著急上火?事情還得從多年以前說起······那時候,這倆兄弟還沒來,就我一個web伺服器,每天處理的不過是一些靜態資源文件,像HTML、CSS、JS、圖片等等,日子過的清閒自在。
  • Springboot中登錄後關於cookie和session攔截案例
    2、每次登錄的時候都要進資料庫校驗下帳戶名和密碼,只是加了cookie 或session驗證後;比如登錄頁面A,登錄成功後進入頁面B,若此時cookie過期,在頁面B中新的請求url到頁面c,系統會讓它回到初始的登錄頁面。(類似單點登錄sso(single sign on))。
  • [接口測試_B] 09 requests中Cookie和會話對象session處理
    因此,cookie和session存在的作用是進行狀態管理。客戶端怎麼能對上這個session暗號?1)、在客戶端給服務端發送請求後,服務端會根據請求信息生成session,同時生成一個session_id,通過cookie返回給客戶端;2)、客戶端再次向服務端發送請求時,會通過cookie將這個session_id發送給服務端,這樣就對上了session的暗號。
  • Session
    不同的地方在於Session將所有的數據都放在伺服器端,用戶瀏覽器的Cookie中只會保存一個非明文的識別信息,比如哈希值。Django提供了一個通用的Session框架,並且可以使用多種session數據的保存方式:保存在資料庫內保存到緩存保存到文件內保存到cookie內通常情況,沒有特別需求的話,請使用保存在資料庫內的方式,儘量不要保存到Cookie內。
  • php session 會話(專題)
    解決方法cookie和session的區別在於cookie是保存在客戶端的,而session是存儲在服務端中。它們都有生存時間的設置,session比cookie更安全。當服務端與客戶端通信後會生成會話後,會建立一個和瀏覽器的唯一會話PHPSESSID。這個id會在服務端保存,也會用cookie形式保存在客戶端中。
  • php中Session使用方法詳解
    設置緩存中的會話文檔在 n 分鐘後過時  session.cookie_lifetime = 0 ; 設置按秒記的cookie的保存時間,相當於設置Session的過期時間,為0時表示直到瀏覽器被重啟session.auto_start=1,這樣就無需每次使用session之前都要調用session_start()不建議使用.但啟用該選項也有一些限制,如果確實啟用了 session.auto_start
  • JavaWeb之Cookie使用詳解
    在JavaWeb裡面Cookie其實就是一份小數據。是伺服器給客戶端並且存儲在客戶端的一份小數據。>response.addCookie(cookie);//給響應添加一個cookie客戶端收到的信息裡面,響應頭多了一個欄位 Set-Cookie②獲取從客戶端過來的