Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于授权的RequestFilter和SessionBean_Java_Session_Jsf 2_Servlet Filters - Fatal编程技术网

Java 用于授权的RequestFilter和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

我正在WebSphereApplicationServer8上使用JSF2.0

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

这非常糟糕,因为我对每个请求都有一个DB查询

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

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

那我该怎么做呢?这是一种错误的方法吗?

请参阅我的类似内容,您应该能够通过这种方法获得SessionBean

编辑

或者你可以试试这种方法

 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);

// ...