0

我在 websphere 应用程序服务器 8 上使用 jsf 2.0。

我有一个授权用户的请求过滤器。用户针对 WebSEAL 认证自己。用户角色保存在 MySQL 数据库中。我的 Requestfilter 从每个请求的 httpServletRequest 获取用户主体。然后我查看用户拥有的角色(在数据库中)。

这很糟糕,因为我对每个请求都有一个数据库查询。

为了改进这一点,我想实现一个包含用户名和角色的 SessionBean。我的问题是,我无法从我的 requestfilter 中获取 sessionbean。我尝试将 sessionbean 用作过滤器类中的 managesproperty。

但是我总是得到一个 Nullpointerexception,因为之前从未调用过 sessionbean。

那么我该怎么做呢?这是错误的方式吗?

4

2 回答 2

1

JSF 将@SessionScoped @ManagedBeans 存储为HttpSession. 因此,在Filter它们内部可用如下:

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");

但是,您需要考虑到,当 bean 尚不存在于范围内时,此方法不会自动创建 bean。在新的 HTTP 会话上首次调用过滤器时会出现这种情况。Filtler即在之前FacesServlet调用。然后您需要自己创建会话bean

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");

if (sessionBean == null) {
    sessionBean = new SessionBean();
    session.setAttribute("sessionBean", sessionBean);
}

// ...

sessionBean.setRole(role);

// ...

只要它已经存在于会话范围内, JSF 就不会用新实例覆盖它,而只是重用在Filter.

于 2012-06-04T16:08:37.440 回答
0

看我类似的答案,你应该可以通过这种方式获得你的 SessionBean

编辑

或者你可以试试这个方法

 HttpSession session = (req (HttpServletRequest)).getSession();
 MyManagedBean myManagedBean = session.getAttribute("myManagedBean");`

或者您可以使用 PhaseListener 代替您的过滤器。请参阅这篇关于使用 PhaseListener 保护您的应用程序的好文章。

于 2012-06-04T11:26:10.907 回答