1. 程式人生 > >session理解與總結【session原理、應用、與cookie區別】

session理解與總結【session原理、應用、與cookie區別】

session原理

session也是一種記錄瀏覽器狀態的機制,但與cookie不同的是,session是儲存在伺服器中。

由於http是無狀態協議,當伺服器儲存了多個使用者的session資料時,如何確認http請求對應伺服器上哪一條session,相當關鍵。這也是session原理的核心內容。

  • 解決方法:伺服器向客戶端傳送一條名為JESSIONID的cookie,它的值是session的id值。通過JESSIONID可以識別http請求對應哪一個使用者。原理圖如下所示:

session相關應用

與cookie共同使用

問題來源:session自動 維護的cookie的maxAge值為-1,這導致,瀏覽器關閉之後,儲存JESSIONID的cookie會消失,伺服器接收不到sessionid,session便會失效。

  • 解決方法:與cookie共同使用。手動建立名為JESSIONID的cookie,通過session.getId()獲取sessionid,存入cookie,並設定maxAge。

程式碼如下:

Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30*60);
cookie.setPath("/"); // 必須是根路徑
response.addCookie(cookie);

經過實踐,這樣做有效。重啟瀏覽器後,session依然可用。

防止表單重複提交

業務場景(重複提交的危害):

  • 在投票的網頁上不停地提交,實現了刷票的效果;
  • 註冊多個使用者,不斷髮帖子,擾亂正常發帖秩序。

解決方法:

  • 在session中儲存一個token,專業做法是使用隨機數或者時間戳;
  • 前端獲取得到這個token,並將token寫入表單的隱藏域中;
  • 在第一次提交表單時,判斷seesion有沒有值,如果有就比對token。對比正確後處理請求,然後刪除session中的資料;
  • 再次訪問的時,session是空的,即避免了重複提交;

一次性驗證碼

目的:防止暴力破解密碼

實現方法:

  • 初次訪問時,服務端生成隨機數,存入session域中,並生成驗證碼圖片傳給前端;
  • 表單填寫完畢後,post請求伺服器;
  • 後端讀取引數中傳遞的驗證碼值,讀取session域中的隨機數值,驗證兩者是否相等。

session與cookie的區別

  • 儲存
    • Cookie只能儲存字串,若要儲存非ASCII字元,還需要對其編碼;
    • Session可以儲存任何型別資料。
  • 隱私
    • Cookie內容對客戶端可見;
    • Session對客戶端不可見。
  • 有效期
    • Cookie通過maxAge設定有效時間;
    • Session通過maxInactiveInterval屬性設定有效時間;除此之外,儲存JESSIONID的cookie有效期與session息息相關。
  • 對伺服器的負擔
    • Session是儲存在伺服器的,每個使用者都會產生一個Session,如果是併發訪問的使用者非常多,是不能使用Session的,Session會消耗大量的記憶體;
    • Cookie是儲存在客戶端的。不佔用伺服器的資源。像baidu、Sina這樣的大型網站,一般都是使用Cookie來進行會話跟蹤。
  • 瀏覽器的支援
    • 瀏覽器有權選擇是否禁用cookie;
    • 若禁用cookie,session可以通過URL地址重寫來進行會話跟蹤。
  • 跨域名上
    • Cookie可以通過設定domain屬性來實現跨域名;
    • Session只在當前域名內有效。

本文和上一篇cookie部落格主要來源與對以下技術部落格的學習,當然不乏自己的思考、實踐和提煉。