我正在尝试@Inject
a @SessionScoped
将 bean 放入过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
where LoginUser
is @SessionScoped
LoginUser 的目的是代表会话的登录用户。
问题是我似乎并不总是得到loginUser
从当前会话开始,我在会话之间出现“泄漏”,因为一个会话的 LoginUser 对象正在与另一个会话共享。显然这不好。
我想知道这是否是因为Filter
对象是单例,或者至少由容器(glassfish)在请求和会话之间重用。 (正确的?)
有没有更好的方法来获取LoginUser
当前会话的对象而不使用过滤器上的属性?
我的问题是容器中只有一个 Filter 实例,实际上是一个单例。似乎 CDI 在第一次使用时将第一个会话级对象注入到 Filter 中,然后 Filter 永远存储该引用,即使对于其他会话也是如此。
我找到了这个解决方案,注入一个工厂对象(实例),我可以在每次过滤器运行时使用它来获取会话实例,即
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private Instance<LoginUser> loginUserSource;
And in
@Override
public void doFilter(...)
LoginUser login = loginUserSource.get();
这似乎解决了我的问题。
Thanks
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)