2011-11-22 47 views
9

如何在@SessionScoped CDI bean中定義會話
僅當從Servlet容器中調用該會話時,該註釋是否有效,會話的定義格式爲HttpSession@SessionScoped如何與EJB一起使用? CDI僅適用於Web層嗎?

如果不是,比如何用@Inject @SessionScoped MyBean myBean可以知道這個session究竟是什麼?我的意思是,這個EJB的方法可能是由獨立客戶端,RESTful WS或其他視圖調用的。
在這種情況下會發生什麼?如果註釋沒有意義,它應該爲每個請求注入新的MyBean實例還是應該在所有請求中保留相同的實例?

回答

3

@SessionScoped specification

會話範圍是活性摘自:任何Servlet過濾器的doFilter()方法時

在web應用, 任何servlet的服務()方法的過程中和當 容器調用任何HttpSessionListener,AsyncListener或ServletRequestListener時。

總之,是的。它綁定到HttpSession。另外:

會話上下文在同一HTTP會話中發生的所有發生在 的servlet請求之間共享。在所有HttpSessionListeners調用 並且在其中調用invalidate()爲 的任何請求的最後,在所有過濾器和ServletRequestListeners被調用後,HTTPSession超時,HTTPSession超時。

+0

真的,即使像SFSB那樣,Session又是如何定義的呢?當然,沒有任何東西可以阻止你創建自己的範圍並將其綁定到任何你喜歡的地方。 – LightGuard

+0

@LightGuard,我猜想在SFSB中,「會話」從SFSB實例化持續到刪除(或超時)。所以只要我有一個參考,我會碰到相同的環境(會話)。 –

+0

@貢薩洛,謝謝你的提供。我想知道 - 如果我在沒有這樣的作用域的環境中使用'@SessionScoped' bean(即所提到的REST WS)會發生什麼。每個請求都被視爲新會話?就像LightGuard所說的那樣,SFSB呢? '@ SessionScoped'會引用'HttpSession'會話還是SFSB會話? –

相關問題