我正在尝试@Inject
@SessionScoped
bean进入过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
其中LoginUser
为@SessionScoped
目的是让loginUser代表会话的登录用户。
问题是我似乎并不总是从当前会话中获取loginUser
,因为一个会话的LoginUser对象正在与另一个会话共享,所以会话之间会出现“泄漏”。显然这不好。
我想知道这是因为Filter
对象是单例,还是至少在容器(glassfish)的请求和会话之间重用。 (右?)
有没有更好的方法来获取当前会话的LoginUser
对象而不使用过滤器上的属性?
答案 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();
这似乎解决了我的问题。
由于