2012-01-01 56 views
3

我知道REST不應該使用HttpSession。 另一方面,REST服務在servlet容器內運行。執行REST和HttpSession對象

HttpSession session = request.getSession(); 

代碼: 從我所看到的,HttpSession對象將只在被創建。情況總是如此嗎?除了使用JSP?


我的問題是:將是HttpSession當REST方法執行或不執行時會創建對象嗎?

假設我使用JAX-RS框架,如果它可以有所作爲。
如果沒有創建這樣的對象,實際上可能意味着服務器內存的大小可能不會增長,而不管有多少客戶端使用它的服務器。

回答

1

HTTP會話實際上經常與REST接口一起使用,但不應該包含任何真正關鍵的東西。因此,它們可以用來包含您已經過身份驗證的事實或某個列表的首選默認排序順序;在前一種情況下,您還可以同時支持其他身份驗證機制以允許完全無狀態操作,並且在後者中,您還可以輕鬆地支持顯式覆蓋。只要你不需要需要一個會話 - 嗯,假設你的網站爲了論證而使用HTTP BASIC認證;如果您使用的是OAuth,那麼您需要啓用會話以阻止性能被削弱 - 那麼您仍然可能合理地接近RESTful(在這個領域當然確實; REST不是「不要使用會話」)。

在超時之前會有多長時間的會話會持續嗎?那麼,也許但不是真的。會話實際上是一個已映射到某個數據庫表中的對象,您可以在其上配置到期策略,以便它們持續足夠長的時間以支持有效使用,而不會過於繁瑣。這取決於一次有多少個客戶端使用該網站,他們的使用模式是什麼,以及您擁有哪些硬件資源(當然)。

+2

感謝您的回覆。可以在REST中訪問會話,就像在這個例子中一樣:public String mysession(@Context HttpServletRequest req)...但是如果我沒有創建什麼會話對象,我該如何保證?我可以嗎? – Cosigin 2012-01-02 03:55:24

0

我認爲這是Java EE框架的限制,目前我還沒有看到它的任何其他服務器呢。如果您需要有一個集裝箱管理security-constraint會話將被創建。

這就是說你不需要實現你的代碼來使用容器管理的身份驗證。人們會像Shiro一樣自己實現身份驗證登錄/機制,而不是。

如果您擔心可疑性,您可能必須自行處理驗證。但是,在繼續此路徑之前,請考慮以下內容......您希望有多少人使用您的應用程序?除非你是一些非常流行的服務,例如Facebook或Google等,現在的硬件/雲服務應該能夠通過HTTP Sessions處理您的負載,並且有足夠的空間可供使用。

但是,如果你想做到這一點的實現自己的話,我建議如下:

  1. 未經身份驗證的客戶端通過憑據(通過WWW-Authorization是最容易與測試)
  2. 憑證的驗證和一個令牌被返回。該令牌是一個編碼的加密字符串,包含客戶端ID,到期日期和授權令牌。此令牌被傳遞迴客戶端與Set-Cookie
  3. 客戶端使用含令牌
  4. 令牌的Cookie以後的請求可以,只要它沒有過期使用,這將只是一個加密的計算服務器節點,因此可以根據需要在多個服務器上進行擴展,而不需要單個數據存儲來處理。
  5. 如果客戶端過期(對於交互可持續幾分鐘的用戶應用程序很有用),可以使用reauth標記爲客戶端生成新標記。

您可以添加一個企業緩存來存儲哪些仍然有效,但需要額外的後端調用。