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

标签 servlets code-injection servlet-filters cdi

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

相关文章:

java - 在充当服务器的 servlet 内进行套接字编程,启动某种服务器推送环境是一个好的解决方案吗?

servlets - Helidon HttpServletRequest header

java - 在JSP中使用jquery ajax没有调用Servlet?

spring - WebSphere 7 中的 Spring 依赖注入(inject)(JSR 330 注释)不起作用

C++ DLL 注入(inject)后不执行函数

java - 必须在 servlet 上以及异步请求处理中涉及的所有过滤器上启用异步支持

java - 带有jsp的tomcat

c++ - 如何注入(inject)从文件加载的shellcode?

spring - 相当于非 Boot Spring 项目的 org.springframework.boot.context.embedded.FilterRegistrationBean?

java - 根据 Servlet/Spring MVC 中的用户凭据显示或隐藏 HTML 页面的部分内容