我正在尝试将 @Inject
@SessionScoped
bean 注入(inject)过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
其中LoginUser
是@SessionScoped
loginUser 的目的是代表 session 的登录用户。
问题是,我似乎并不总是从当前 session 中获取 loginUser
,因为一个 session 的 LoginUser 对象与另一个 session 共享,所以我在 session 之间出现“泄漏”。显然这不好。
我想知道这是否是因为 Filter
对象是单例,或者至少由容器(glassfish)在请求和 session 之间重用。 (对吗?)
有没有更好的方法来获取当前 session 的 LoginUser
对象,而不使用过滤器上的属性?
最佳答案
我的问题是容器中只有一个 Filter 实例,实际上是一个单例。看起来 CDI 在第一次使用时将第一个 session 级对象注入(inject)到 Filter 中,然后 Filter 永远存储该引用,即使对于其他 session 也是如此。
我找到了这个解决方案,注入(inject)一个工厂对象(实例),我可以使用它在每次过滤器运行时获取 session 实例,即
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private Instance<LoginUser> loginUserSource;
并且在
@Override
public void doFilter(...)
LoginUser login = loginUserSource.get();
这似乎解决了我的问题。
谢谢
关于servlets - 在 Servlet 中使用 CDI 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9609656/