RequestFilter和SessionBean用于授权

时间:2012-06-04 11:15:31

标签: java session jsf-2 servlet-filters

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

我有一个授权用户的请求过滤器。用户针对WebSEAL进行身份验证。 用户角色保存在MySQL DB中。 我的Requestfilter在每个请求中从httpServletRequest获取用户主体。 然后我查看用户具有哪个角色(在数据库中)。

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

为了改进这一点,我想实现一个包含用户名和角色的SessionBean。 我的问题是,我无法从我的requestfilter获取sessionbean。 我已经尝试在sessionclass中使用sessionbean作为manageproperty。

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

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

2 个答案:

答案 0 :(得分:1)

JSF将@SessionScoped @ManagedBean存储为HttpSession的属性。因此,在Filter内,它们可用如下:

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

但是,您需要考虑到这种方法在范围内不存在时不会自动创建bean。在新的新HTTP会话上首次调用过滤器时会出现这种情况。 Filtler是在<{em> 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中创建的完全相同的实例。

答案 1 :(得分:0)

查看我的类似answer,您应该能够以这种方式获取SessionBean

修改

或者您可以尝试这种方法

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

或者您可以使用PhaseListener而不是过滤器。有关使用PhaseListener保护您的应用的信息,请参阅此article