Java 用于授权的RequestFilter和SessionBean
我正在WebSphereApplicationServer8上使用JSF2.0 我有一个授权用户的请求过滤器。用户根据WebSEAL对自己进行身份验证。 用户角色保存在MySQL数据库中。 我的Requestfilter从httpServletRequest获取每个请求的用户主体。 然后我查看用户(在数据库中)的角色 这非常糟糕,因为我对每个请求都有一个DB查询 为了改进这一点,我想实现一个包含用户名和角色的SessionBean。 我的问题是,我无法从requestfilter获取sessionbean。 我尝试在filterclass中使用sessionbean作为managesproperty 但是我总是得到一个Nullpointerexception,因为以前从未调用过sessionbean 那我该怎么做呢?这是一种错误的方法吗?请参阅我的类似内容,您应该能够通过这种方法获得SessionBean 编辑 或者你可以试试这种方法Java 用于授权的RequestFilter和SessionBean,java,session,jsf-2,servlet-filters,Java,Session,Jsf 2,Servlet Filters,我正在WebSphereApplicationServer8上使用JSF2.0 我有一个授权用户的请求过滤器。用户根据WebSEAL对自己进行身份验证。 用户角色保存在MySQL数据库中。 我的Requestfilter从httpServletRequest获取每个请求的用户主体。 然后我查看用户(在数据库中)的角色 这非常糟糕,因为我对每个请求都有一个DB查询 为了改进这一点,我想实现一个包含用户名和角色的SessionBean。 我的问题是,我无法从requestfilter获取sessio
HttpSession session = (req (HttpServletRequest)).getSession();
MyManagedBean myManagedBean = session.getAttribute("myManagedBean");`
或者你可以用PhaseListener代替你的过滤器。使用PhaseListener保护您的应用程序的好处如下。JSF将
@SessionScoped@ManagedBean
s存储为HttpSession
的属性。因此,在过滤器中,它们的可用性如下:
HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");
但是,您需要考虑到,当bean还不在范围内时,这种方法不会自动创建bean。在新的HTTP会话上第一次调用筛选器时就是这种情况。即在FacesServlet
之前调用filter
。然后您需要自己创建会话bean
JSF不会在会话作用域中已经存在的情况下使用新实例覆盖它,而只是重用在过滤器中创建的同一个实例,现在我得到了nullpointerexception:session=(HttpSession)context.getExternalContext().getSession(true);不,您将在筛选器中获得SessionBean(保存在会话中),然后您可以正常调用方法,就像它被注入ManagedProperty一样。我的会话中没有SessionBean。会话的构造函数从未被调用…什么对象会导致空指针异常?您尝试了哪种方法(请参见我的编辑)?您必须更具体地获取建议。。。
HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");
if (sessionBean == null) {
sessionBean = new SessionBean();
session.setAttribute("sessionBean", sessionBean);
}
// ...
sessionBean.setRole(role);
// ...