【问题标题】:How to access sessions in tomcat and terminate one of them如何访问tomcat中的会话并终止其中一个
【发布时间】:2014-09-13 17:36:51
【问题描述】:

这是否可以在 Tomcat 中以编程方式终止其他用户的 HTTP 会话?我的用例是这样的:网站上有一些用户,还有一个管理员。当管理员删除特定用户时,如果他有活动会话,我希望他立即注销。可以从应用程序代码访问用户的会话吗?

【问题讨论】:

    标签: java http session tomcat jakarta-ee


    【解决方案1】:

    您需要维护userId->HttpSession 的并发映射。当用户登录时,将其放入地图中。当会话为destroyed 时,将其从地图中移除。

    现在给定一个 userId,您可以从地图中检索会话,然后 invalidate 它。

    【讨论】:

    • 警告:如果您有多个 Tomcat 和会话集群,这将不起作用。您还需要在 Tomcat 之间分发 userId->HttpSession 映射。
    【解决方案2】:

    是的,可以列出 Tomcat 中所有已登录或工作的用户会话,并将其终止到任何一个会话
    (如果在安装时您选择了主机管理器,那么可以使用用户名和密码)

    > 键入 URI 作为 http://localhost:8080/ (8080 是你的 tomcat 的默认连接器端口,如果你改变了它然后写它) > 选择管理应用程序选项 > 输入您在安装时输入的用户名和密码 > 登录成功后单击会话列中的会话(0 或 1,2,3...等),请参阅第一列显示您的项目名称 > 点击“刷新会话列表”按钮 > 选择会话 ID 复选框 > 单击“使选定会话无效”按钮 单击此按钮后,该会话将无效

    【讨论】:

    • 实际上,我一直在寻找一种程序化的方式来做到这一点。很抱歉忘记在我的问题中提及它。
    【解决方案3】:

    我在其他问题的答案中找到了解决方案:

    Tomcat: how to access (session) Manager from servlet

    诀窍是使用反射从HttpSessionServletContext 获取Manager。对我有用的代码:

    private Manager manager(HttpSession session) throws Exception {
    
        Field facadeSessionField = StandardSessionFacade.class.getDeclaredField("session");
        facadeSessionField.setAccessible(true);
        StandardSession stdSession = (StandardSession) facadeSessionField.get(session);
    
        return stdSession.getManager();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2011-05-13
      相关资源
      最近更新 更多