Servlets 在Servlet中使用CDI注入
我正在尝试Servlets 在Servlet中使用CDI注入,servlets,code-injection,servlet-filters,cdi,Servlets,Code Injection,Servlet Filters,Cdi,我正在尝试@将@SessionScopedbean注入过滤器 @WebFilter("/*") public class IdentityFilter implements Filter, Serializable { @Inject private LoginUser loginUser; ... 其中登录用户是@SessionScoped 其目的是让loginUser代表会话的登录用户 问题在于,我似乎并不总是从当前会话中获得logiuser,我在会话之间获得“泄漏”,因
@将@SessionScoped
bean注入过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
其中登录用户
是@SessionScoped
其目的是让loginUser代表会话的登录用户
问题在于,我似乎并不总是从当前会话中获得logiuser
,我在会话之间获得“泄漏”,因为一个会话的logiuser对象正在与另一个会话共享。显然这不好
我想知道这是否是因为Filter
对象是一个单例对象,或者至少是容器(glassfish)在请求和会话之间重用的。(对吗?)
是否有更好的方法可以在不使用筛选器属性的情况下获取当前会话的LoginUser
对象?我的问题是容器中只有一个筛选器实例,实际上是一个单实例。CDI似乎在第一次使用时将第一个会话级对象注入过滤器,然后过滤器将永远存储该引用,即使对于其他会话也是如此
我找到了这个解决方案,注入一个工厂对象(实例),我可以在每次过滤器运行时使用它来获取会话实例,即
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private Instance<LoginUser> loginUserSource;
这似乎解决了我的问题
谢谢您能粘贴登录用户代码吗?如果你没有一个没有参数的非私有构造函数,或者这个类是final,或者没有final方法,那么它将无法工作。谢谢Fabrico。我想这没关系,肯定是的。问题是分享。。。我想我发现了问题所在,威尔·波斯特。事实上,CDI使用代理工作,而这不是实际的登录用户实例,只要它没有依赖范围,并且满足我第一次评论中的要求。+1到Fabricio Lemos的回答。CDI提供代理。这是CDI规范(对于所有正常范围的bean)强制要求的。请确保您使用的@SessionScoped确实是CDI版本(javax.enterprise.context.SessionScoped),而不是JSF版本(java.faces.bean.SessionScoped)。这是一个常见错误,如果IDE只是从错误的包中自动导入注释,就会发生这种错误。这些JSF作用域自EE6以来就被认为是遗留的,甚至可能在未来的JSF版本中被弃用。
@Override
public void doFilter(...)
LoginUser login = loginUserSource.get();