簡體   English   中英

在 Java web 應用程序中使用會話的主要用例

[英]Top use cases for using Sessions in Java web application

我一直在努力避免使用 Sessions。 我使用了 spring 安全性或其他讓用戶登錄應用程序的方式,我認為這是使用會話的主要用例。

但是其他用例是什么? 你能列出那些最重要的嗎? 為什么我能夠在不使用 Sessions 的情況下開發更復雜的應用程序?

是因為我使用的是 spring-mvc 並且除了登錄內容之外實際上不需要使用 Sessions 嗎?

編輯:伙計們,這個問題是在詢問用例......大多數答案都解釋了會話的用途。 如果我們總結一些用例,我們可以肯定地說,何時使用數據庫或會話來維護會話 state...您不記得您需要會話的任何具體場景嗎? 過去幾年:)

例如,某些會話 state 可能在某個點/事件之后變得持久。 在這種情況下,我從一開始就使用數據庫。

我認為您可以做任何您想做的事情,而無需在會話中存儲任何內容。

我通常使用會話來避免在客戶端和服務器之間傳遞 state(以 id 為例)以及當我不想向客戶端發送敏感信息(即使是加密形式)時,因為這可能是一個安全問題.

避免使用 session 的其他方法是:

  • 將一些 state 存儲在數據庫(例如購物車)中,而不是存儲在 session 中,即使購物車在一定時間后被丟棄。
  • 將 state 存儲在 cookies 中,例如用於用戶定制

使用 session 真正有用的一個用例是用於對話,盡管通常框架在幕后管理它,並將對話存儲在 session 中。

編輯

轉換(在我的理解中)類似於向導,您可以在其中完成不同頁面中的幾個 forms,最后執行操作。 例如,在結帳過程中,用戶在不同的頁面中輸入他的姓名、送貨地址和信用卡詳細信息,但您想在最后提交訂單,而不在您的數據庫中存儲任何中間 state。

我的意思是敏感信息,想象在前面的例子中,一旦用戶發送了他的信用卡詳細信息,你不應該以任何格式(甚至加密)將該信息返回給用戶。 我知道這有點偏執,但這就是安全性:)。

在我正在開發的電子商務系統中,后端有一個外部系統,用於存儲用戶保存的送貨和賬單地址。 我們的 web 應用程序通過調用 web 服務調用來檢索這些地址來與之對話。 當我們得到地址時,我們將它們存儲在 session 中。 這樣,當用戶第一次查看他們的地址時,我們只需要調用一次服務,而不是每次我們提供需要地址信息的頁面時。 我們對地址有一個生存時間,所以如果地址發生變化(例如,如果用戶致電客戶服務台更改地址),我們最終會選擇新的。

可以將地址存儲在我們的數據庫中,而不是 session 中。 但我們為什么要這樣做? 它是暫時的信息,已經永久存儲在其他地方。 session 是它的理想場所。

好吧,從某種意義上說,您的問題很深(session 有什么特別之處值得了解),而在另一種意義上,它很淺(如果我不使用它們,我不能做什么,結果是一個有點奇怪的問題)

最后,Session 只是(或可能是)一個 ConcurrentHashMap(實際上它通常不是線程安全的),帶有一個唯一的 session id 作為 cookie 傳遞的鍵。 你知道它為什么有用,但要回答你的用例

  • 集群(這就是 state 跨節點分布的方式)
  • 緩存用戶及其對象的一般 state (而不是每次從數據庫重新加載)
  • 當有人超時或屬性更改時,會話偵聽器的內置方法可以監視。 = 被許多本地化實用程序使用

您可以使用數據庫或您自己的 hashmap 實現/過濾器來完成所有這些工作嗎? 當然,Sessions 並沒有什么神奇之處。 它們只是讓某些對象跟隨登錄用戶並與該用戶使用應用程序的生命周期相關聯的方便標准。

為什么要使用 Servlets? 您還可以實現自己的套接字級別標准嗎? 答案是使用標准的 apis/implementations 提供了便利,並且其他庫建立在它們之上。

缺點是

  • 您正在重新發明輪子和一些經過時間測試的代碼
  • 您將無法使用大量內置設施進行監控/管理/集群/本地化等。

會話是跨多個請求(例如多個無狀態 HTTP 請求)維護會話 state 的一種方式。

還有其他實現會話 state 的方法,例如,將身份驗證令牌或某些合適的會話 id 存儲為 cookie 並將會話 id 存儲到 session Z9ED39E2EA931586B6A985A6942EF7。 (本質上,復制應用服務器在提供會話時所做的事情。)

您不需要使用會話意味着您的應用程序不需要會話 state 或者您已經以不同的方式實現它。 例如,也許您的應用程序使用身份驗證令牌(例如 cookie)並將所有 state 更改保存到數據庫。 有了這種安排,就不需要對話 state。

嗨,您可以舉一個購物車的例子,因為 Http 是無狀態協議,它不會維護發送請求的用戶的狀態。

例如,如果一個用戶從 eBay 發送購買相機的請求,幾分鍾后另一個用戶發送購買筆記本電腦的請求。

但是由於 http 是無狀態協議,因此服務器無法分離用戶發送的請求,並且可能會發生筆記本電腦的賬單可能會給第一個用戶。

因此,通過 session,我們可以在服務器端為特定用戶維護特定實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM