Jsf 当使用不同的用户登录时,CDI SessionScoped Bean实例保持不变

Jsf 当使用不同的用户登录时,CDI SessionScoped Bean实例保持不变,jsf,cdi,jboss-weld,j-security-check,session-scope,Jsf,Cdi,Jboss Weld,J Security Check,Session Scope,我一直在寻找解决这个问题的方法,但时间相当长,没有结果,所以我在这里提出了一个问题 简单地说,我在项目中使用CDI SessionScoped Bean用户来管理用户信息并将其显示在jsf页面上。此外,容器管理的j_安全检查用于解决身份验证问题 如果先使用session.invalidate注销,然后使用其他用户登录同一浏览器选项卡,则一切正常。但是,当我试图通过login.jsf直接登录一个新用户而不事先注销时,我发现用户信息保持不变 我调试并发现,只要未调用session.invalidat

我一直在寻找解决这个问题的方法,但时间相当长,没有结果,所以我在这里提出了一个问题

简单地说,我在项目中使用CDI SessionScoped Bean用户来管理用户信息并将其显示在jsf页面上。此外,容器管理的j_安全检查用于解决身份验证问题

如果先使用session.invalidate注销,然后使用其他用户登录同一浏览器选项卡,则一切正常。但是,当我试图通过login.jsf直接登录一个新用户而不事先注销时,我发现用户信息保持不变

我调试并发现,只要未调用session.invalidate,用户bean以及HttpSession实例在同一浏览器中与不同用户登录时始终保持不变。但奇怪的是,会话id确实被修改了,我已经签入了Java代码和Firebug

org.apache.catalina.session.StandardSessionFacade@5d7b4092
StandardSession[c69a71d19f369d08b5dddbea2ef0]
attrName = org.jboss.weld.context.conversation.ConversationIdGenerator : attrValue=org.jboss.weld.context.conversation.ConversationIdGenerator@583c9dd8
attrName = org.jboss.weld.context.ConversationContext.conversations : attrValue = {}
attrName = org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-Discipline-ManagedBean-class com.netease.qa.discipline.profile.User : attrValue = Bean: Managed Bean [class com.netease.qa.discipline.profile.User] with qualifiers [@Any @Default @Named]; Instance: com.netease.qa.discipline.profile.User@c497c7c; CreationalContext: org.jboss.weld.context.CreationalContextImpl@739efd29
attrName = javax.faces.request.charset : attrValue = UTF-8

org.apache.catalina.session.StandardSessionFacade@5d7b4092
StandardSession[c6ab4b0c51ee0a649ef696faef75]
attrName = org.jboss.weld.context.conversation.ConversationIdGenerator : attrValue = org.jboss.weld.context.conversation.ConversationIdGenerator@583c9dd8
attrName = com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap : attrValue = {-4968076393130137442={-7694826198761889564=[Ljava.lang.Object;@43ff5d6c}}
attrName = org.jboss.weld.context.ConversationContext.conversations : attrValue = {}
attrName = org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-Discipline-ManagedBean-class com.netease.qa.discipline.profile.User : attrValue = Bean: Managed Bean [class com.netease.qa.discipline.profile.User] with qualifiers [@Any @Default @Named]; Instance: com.netease.qa.discipline.profile.User@c497c7c; CreationalContext: org.jboss.weld.context.CreationalContextImpl@739efd29
attrName = javax.faces.request.charset : attrValue = UTF-8
上面的块包含两个连续登录及其会话信息。我们可以看到instance1st行相同,而SessionID2nd行不同。似乎会话对象被重用以包含不同的会话id,CDI框架仅根据会话对象管理会话bean生命周期

我想知道在同一个浏览器中是否只有一个服务器端会话对象,除非无效

由于我采用了j_安全检查,我想拦截它并使旧会话无效并不是那么容易。那么,在不改变CDI+JSF+j_安全检查设计的情况下,是否有可能实现这个目标,即可以在同一浏览器的相同或不同选项卡中使用不同的帐户重新登录

真的很期待你的回复

更多信息: Glassfish v3.1是我的appserver。

我建立了一个HttpSessionListener,并找到了为每个重新登录调用的sessionCreated方法。但是会话instanceorg.apache.catalina.session.StandardSessionFacade总是相同的,而session.getId返回不同的会话id。