gpt4 book ai didi

servlets - 在 Servlet 中使用 CDI 注入(inject)

转载 作者:行者123 更新时间:2023-12-02 10:03:11 24 4
gpt4 key购买 nike

我正在尝试将 @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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com