我目前正在@ApplicationScoped
bean中维护所有当前活动的HTTPSession的Map。 (根据此处的建议以及其他各种主题:Invalidate Session of a specific user)
我正在使用@WebListener
实施HttpSessionListener
的{{1}}方法添加到当前会话列表中,并在sessionCreated
上将其删除。
管理员用户可以从JSF(Richfaces 4.3.1)页面访问此列表,并有选择地使特定会话无效。
问题,当登录的管理员(会话A)选择并呼叫sessionDestroyed
以使用户的会话从列表(例如,会话B),管理员页面无效时(或者会话?)本身就会被破坏,当前页面上的链接/操作仍在处理中(我看到操作方法是从控制台输出中命中的),但没有重定向或导航工作(从注销链接开始)调用会话A上的invalidate,然后成功重定向到登录页面)。控制台中不会显示任何错误或警告,即使在关闭浏览器窗口并将其重新打开到同一会话(A)后,这种损坏的行为仍然存在。
通过查看Chrome的“网络”标签,我看到每次重定向尝试都会创建一个单独的POST,但没有别的。
我们的大多数导航都是在faces-config.xml中设置的,如下所示:
session.invalidate()
我完全没有想法,特别是因为网上的所有建议似乎都指向我目前正在做的事情......任何人都可以解释为什么会发生这种情况,或推测我可能做错了什么或如何解决它?
谢谢,如果需要更好的信息,请告诉我。
是:
修改
删除代码示例......
Bean,用于保存会话映射(每个都在自定义包装器对象<navigation-case>
<from-action>#{logoutAction.doLogout}</from-action>
<to-view-id>/login.xhtml</to-view-id>
<redirect/>
</navigation-case>
中,以保存其他用户信息):
SessionUserFacade
简单的@WebListener来调用app-scoped bean:
@Named
@ApplicationScoped
public class AppSessionsStateBean implements Serializable {
private final Map<String, SessionUserFacade> currentSessions = Collections.synchronizedMap(new HashMap<String, SessionUserFacade>());
public void addSession(HttpSession session) {
currentSessions.put(session.getId(), new SessionUserFacade(null, session));
}
public void removeSession(HttpSession session) {
currentSessions.get(session.getId()).setSession(null);
currentSessions.remove(session.getId());
}
public Map<String, SessionUserFacade> getCurrentSessions() {
return currentSessions;
}
}
从@WebListener
public class SessionListener implements HttpSessionListener{
@Inject
private AppSessionsStateBean appStateBean;
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
appStateBean.addSession(httpSessionEvent.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
appStateBean.removeSession(httpSessionEvent.getSession());
}
}
@Named
bean中的前端访问的操作方法(invalidateSession只是@ViewAccessScoped
的直接包装):
HttpSession.invalidate();
来自:
public void invalidateSelected() {
for (SessionUserFacade session : selectionItems) {
if (session.isLoggedIn()) {
session.invalidateSession();
}
}
clearSelection();
}