Экземпляр CDI SessionScoped Bean остается неизменным при входе в систему с другим пользователем - PullRequest
1 голос
/ 16 октября 2011

Я искал решение этой проблемы довольно много времени и безрезультатно, поэтому я задаю вопрос здесь.

Проще говоря, я использую компонент SessionScoped Bean User вМой проект для управления пользовательской информацией и отображения ее на страницах JSF.Также управляемый контейнером j_security_check используется для решения проблемы аутентификации.

Все хорошо, если сначала выйти из системы с помощью session.invalidate(), а затем войти в ту же вкладку браузера с другим пользователем.Но когда я попытался напрямую войти (через login.jsf) с новым пользователем без выхода из системы, я обнаружил, что информация о пользователе осталась неизменной.

Я отладил и обнаружил bean-компонент User, а также экземпляр HttpSession, который всегда оставался неизменным, если вход в систему с разными пользователями в одном и том же браузере до тех пор, пока session.invalidate() не вызывается.Но, как ни странно, идентификатор сессии изменился, и я проверил и код 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-й ряд) одинаков, а идентификатор сеанса (2-й ряд) разный.Кажется, что объект сеанса повторно используется для хранения другого идентификатора сеанса, а структура CDI управляет жизненным циклом сессионного компонента в соответствии только с объектом сеанса (?).

Мне интересно, может ли бытьтолько один объект сеанса на стороне сервера в том же браузере, если не признан недействительным?

Поскольку я принимаю j_security_check, мне кажется, что перехватить его и сделать недействительным старый сеанс не так просто.Так возможно ли достичь цели, не изменяя дизайн CDI + JSF + j_security_check, который можно повторно зарегистрировать с другой учетной записью на одной и той же или другой вкладке в одном и том же браузере?

Действительно ждем вашего ответа.

Больше информации: Glassfish v3.1 - мой appserver.

...