使特定用户的会话无效,导致自己的JSF页面导航中断

时间:2013-04-23 12:56:31

标签: java jsf session invalidation

我目前正在@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()

我完全没有想法,特别是因为网上的所有建议似乎都指向我目前正在做的事情......任何人都可以解释为什么会发生这种情况,或推测我可能做错了什么或如何解决它?

谢谢,如果需要更好的信息,请告诉我。

是:

  • Java EE 6
  • JSF 2.1
  • Jboss AS 7.1.1
  • Richfaces 4.3.1

修改

删除代码示例......

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();
}

0 个答案:

没有答案