我正在尝试向我的 Java EE 应用程序添加一个过滤器,但我遇到了一些问题。
我想将过滤器用于登录目的,所以我需要让它与管理登录的UserManager bean“对话”。
这是我的结构:
- LoginFilter : ServletFilter
- LoginBean : 一个SessionScoped 托管 Bean
- UserManager:有状态会话 Bean
UserManager必须由LoginFilter和LoginBean访问,因为它具有处理登录过程的方法。
在LoginBean中,我用这个简单的行得到了UserManager :
@EJB private UserManagerLocal userManager;
我不能在LoginFilter中这样做,所以我不得不编写一个查找方法:
try{
Context c = new InitialContext();
return (UserManagerLocal) c.lookup("java:global/PROJECT/PROJECT-ejb/UserManager!ejb.UserManagerLocal");
} catch (NamingException ex) {
...
}
我也有一行将这个UserManagerLocal添加到请求属性中,但是它抛出了 NPE,因为当我调用查找方法时没有请求,所以我将它移到了doFilter()方法中。
public void doFilter(...){
HttpServletRequest req = (HttpServletRequest) request;
if(req.getAttribute("userManager") == null){
req.setAttribute("userManager", userManager);
}
...
}
现在问题来了。
LoginFilter和LoginBean使用两个不同的UserManager实例!这使得我的过滤器即使是登录的用户也停止了,因为LoginBean在UserManager的另一个实例上工作,所以LoginFilter不知道登录已经完成!
我该如何解决?我认为查找和注入会返回相同的SSFB实例!