Jon*_*han 10 servlets code-injection cdi servlet-filters
我试图@Inject一@SessionScoped豆成过滤器
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private LoginUser loginUser;
...
Run Code Online (Sandbox Code Playgroud)
这里LoginUser是@SessionScoped
目的是loginUser表示会话的登录用户.
问题是看起来我并不总是loginUser从当前会话中获取,因为一个会话的LoginUser对象正在与另一个会话共享,所以会话之间会出现"泄漏".显然这不好.
我想知道这是因为Filter对象是单例,还是至少在容器(glassfish)的请求和会话之间重用.(对?)
是否有更好的方法来获取LoginUser当前会话的对象而不使用Filter上的属性?
我的问题是容器中只有一个Filter实例,实际上是一个单例.似乎CDI在第一次使用时将第一个会话级对象注入Filter,然后Filter会永久存储该引用,即使对于其他会话也是如此.
我找到了这个解决方案,注入一个工厂对象(Instance),每次Filter运行时我都可以使用它来获取会话实例,即
@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {
@Inject
private Instance<LoginUser> loginUserSource;
Run Code Online (Sandbox Code Playgroud)
并在
@Override
public void doFilter(...)
LoginUser login = loginUserSource.get();
Run Code Online (Sandbox Code Playgroud)
这似乎解决了我的问题.
谢谢
| 归档时间: |
|
| 查看次数: |
6653 次 |
| 最近记录: |