2

我正在尝试向我的 Java EE 应用程序添加一个过滤器,但我遇到了一些问题。

我想将过滤器用于登录目的,所以我需要让它与管理登录的UserManager bean“对话”。

这是我的结构:

  • LoginFilter : ServletFilter
  • LoginBean : 一个SessionScoped 托管 Bean
  • UserManager:有状态会话 Bean

UserManager必须由LoginFilterLoginBean访问,因为它具有处理登录过程的方法。

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

现在问题来了。

LoginFilterLoginBean使用两个不同UserManager实例!这使得我的过滤器即使是登录的用户也停止了,因为LoginBean在UserManager的另一个实例上工作,所以LoginFilter不知道登录已经完成!

我该如何解决?我认为查找和注入会返回相同的SSFB实例!

4

1 回答 1

1

不,它将返回新实例。即使您多次在过滤器中进行查找,它也会返回不同的实例。

您需要维护/使用您在过滤器中创建的 UserManagerLocal 实例,而不是在 LoginBean 中注入 UserManagerLocal 从请求中获取相同的实例。

于 2012-10-04T13:39:41.220 回答