在Servlet中使用CDI注入

时间:2012-03-07 21:51:34

标签: servlets code-injection servlet-filters cdi

我正在尝试@Inject @SessionScoped bean进入过滤器

@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {

    @Inject
    private LoginUser loginUser;
...

其中LoginUser@SessionScoped

目的是让loginUser代表会话的登录用户。

问题是我似乎并不总是从当前会话中获取loginUser,因为一个会话的LoginUser对象正在与另一个会话共享,所以会话之间会出现“泄漏”。显然这不好。

我想知道这是因为Filter对象是单例,还是至少在容器(glassfish)的请求和会话之间重用。 (右?)

有没有更好的方法来获取当前会话的LoginUser对象而不使用过滤器上的属性?

1 个答案:

答案 0 :(得分:9)

我的问题是容器中只有一个Filter实例,实际上是一个单例。似乎CDI在第一次使用时将第一个会话级对象注入Filter,然后Filter会永久存储该引用,即使对于其他会话也是如此。

我找到了这个解决方案,注入一个工厂对象(Instance),每次Filter运行时我都可以使用它来获取会话实例,即

 @WebFilter("/*")
 public class IdentityFilter implements Filter, Serializable {

      @Inject 
      private Instance<LoginUser> loginUserSource;

并在

 @Override
 public void doFilter(...)
      LoginUser login   = loginUserSource.get();

这似乎解决了我的问题。

由于