1

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

简单来说,我User在我的项目中使用了一个 CDI SessionScoped Bean 来管理用户信息并将它们显示在 jsf 页面上。容器管理j_security_check也用于解决身份验证问题。

session.invalidate()如果先用不同的用户注销然后在同一个浏览器选项卡中登录,一切都很好。但是当我尝试login.jsf使用新用户直接登录(通过)而不事先注销时,我发现用户信息保持不变。

我调试并发现Userbean 以及HttpSession实例,如果在同一个浏览器中使用不同的用户登录,只要session.invalidate()不被调用,它总是保持不变。但奇怪的是,会话 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

上面的块包含两个连续的登录及其Session信息。我们可以看到实例(第 1 行)相同,而会话 id(第 2 行)不同。似乎会话对象被重用以包含不同的会话ID,并且CDI框架仅根据会话对象管理会话bean生命周期(?)。

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

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

真的很期待您的回复。

更多信息:Glassfish v3.1 是我的应用服务器。

4

0 回答 0