Java 開發中頻繁出現三個「Session」:HttpSession、HttpServletRequest.getSession()、Hibernate Session。它們生命週期、作用域、用途截然不同。
| 維度 | HttpSession | HttpServletRequest.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 或資料庫傳遞數據。OpenSessionInViewFilter 自動管理)。HttpSession 存儲少量用戶狀態,避免大對象導致內存壓力。request.setAttribute(),重定向用 Session 或閃存模式。