在Web过滤器中访问会话范围的JSF管理Bean

18

我有一个名为UserSession的SessionScoped Bean,用于跟踪用户信息(用户名、登录状态等)。我想要过滤一些页面,因此我需要从我创建的WebFilter中访问该Bean。我该怎么做?看起来甚至无法导入该bean以使其潜在可见。


2个回答

28

JSF在幕后将会话范围的托管 bean 作为 HttpSession 的属性存储,使用托管 bean 名称作为键。

因此,只要您有一个@ManagedBean @SessionScoped public class User {},在doFilter()方法中就只需要这样做:

HttpSession session = ((HttpServletRequest) request).getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;

if (user != null && user.isLoggedIn()) {
    // Logged in.
}

或者,如果您实际上是使用CDI来管理bean而不是JSF,那么在过滤器中直接使用@Inject

另请参阅:


1
我能告诉你@BalusC,你应该被授予JSF大师的称号。 - Jalal Sordo
@BalusC:我该如何检查CDI注入的(会话)bean是否已经实例化,而不调用该bean上的方法(这将在尚未存在该bean的情况下创建该bean)? session.getAttribute(<userBean>)与CDI不兼容。谢谢。 - Toru

4
作为替代方案,您可以使用CDI-beans并正常注入您的sessionbean。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接