我在websphere应用服务器8上使用jsf 2.0。
我有一个授权用户的请求过滤器。用户针对WebSEAL进行身份验证。 用户角色保存在MySQL DB中。 我的Requestfilter在每个请求中从httpServletRequest获取用户主体。 然后我查看用户具有哪个角色(在数据库中)。
这很糟糕,因为我对每个请求都有一个数据库查询。
为了改进这一点,我想实现一个包含用户名和角色的SessionBean。 我的问题是,我无法从我的requestfilter获取sessionbean。 我已经尝试在sessionclass中使用sessionbean作为manageproperty。
但是我总是得到一个Nullpointerexception,因为之前从未调用sessionbean。
那我该怎么做呢?这是错误的方式吗?
答案 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)