session理解與總結【session原理、應用、與cookie區別】
阿新 • • 發佈:2020-02-15
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部落格主要來源與對以下技術部落格的學習,當然不乏自己的思考、實踐和提煉。
- Servlet第五篇【介紹會話技術、Cookie的API、詳解、應用】
- Servlet第六篇【Session介紹、API、生命週期、應用、與Cookie區別】