首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

深入理解 Java 三大 Session 概念區別

     編輯:Java 綜合教學

常見混淆點

Java 開發中頻繁出現三個「Session」:HttpSession、HttpServletRequest.getSession()、Hibernate Session。它們生命週期、作用域、用途截然不同。

詳細對比

維度HttpSessionHttpServletRequest.getSession()Hibernate Session
完整類型 javax.servlet.http.HttpSession 返回 HttpSession 實例 org.hibernate.Session
生命週期 整個會話(瀏覽器關閉或超時失效) 單次請求範圍(轉發有效,重定向失效) 單次數據庫事務/操作(手動 open/close)
作用域 用戶級,跨請求共享 請求級,線程隔離 線程級,通常綁定當前線程
主要用途 存儲用戶登錄狀態、購物車等會話數據 請求轉發時傳遞臨時數據 ORM 一級緩存、延遲加載、事務管理
創建/獲取 request.getSession(true) 自動創建 同左,但常誤以為是新對象 sessionFactory.openSession() 或 getCurrentSession()
銷毀方式 超時、invalidate()、瀏覽器關閉 請求結束自動銷毀 手動 close()、事務提交/回滾

關鍵誤區澄清

  • request.getSession() 並非創建新 Session,而是獲取當前請求關聯的 HttpSession(若無則創建)。
  • 重定向(sendRedirect)會發起新請求,原請求域對象失效,只能靠 Session 或資料庫傳遞數據。
  • Hibernate Session 非線程安全,嚴禁作為實例變量共享,應採用「一請求一 Session」模式(Spring OpenSessionInViewFilter 自動管理)。

最佳實踐建議

  1. Web 層僅使用 HttpSession 存儲少量用戶狀態,避免大對象導致內存壓力。
  2. 請求轉發用 request.setAttribute(),重定向用 Session 或閃存模式。
  3. DAO 層通過 Spring 事務管理自動綁定/關閉 Hibernate Session,禁止手動管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved