Java 如何访问tomcat中的会话并终止其中一个会话

Java 如何访问tomcat中的会话并终止其中一个会话,java,http,session,tomcat,jakarta-ee,Java,Http,Session,Tomcat,Jakarta Ee,这是否可以在Tomcat中以编程方式终止其他用户的HTTP会话?我的用例是这样的:网站上有一些用户,还有一个管理员。当管理员删除特定的用户,我希望他立即注销,如果他有一个活动的会话。可以从应用程序代码访问用户会话吗?是的,可以在Tomcat中列出所有已登录或正在工作的用户会话,并将其终止到任何一个会话 (如果在安装时您已选择主机管理器,则可以使用用户名和密码) >键入URI作为http://localhost:8080/ (8080是tomcat的默认连接器端口,如果您已经更改了它,则将其写入

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

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

>键入URI作为http://localhost:8080/ (8080是tomcat的默认连接器端口,如果您已经更改了它,则将其写入) >选择管理应用程序选项 >输入安装时输入的用户名和密码 >成功登录后,单击会话列中的会话(0或1、2、3…等),请参见显示项目名称的第一列 >单击“刷新会话列表”按钮 >选中会话Id复选框 >单击“使所选会话无效”按钮 单击此按钮后,会话将无效
您需要维护
userId->HttpSession
的并发映射。当用户登录时,将其放入地图中。会话启动后,将其从映射中删除


现在,给定一个用户ID,您可以从地图中检索会话,并将其删除。

我找到了一个解决方案来回答其他问题:

诀窍是使用反射从
HttpSession
ServletContext
获取
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();
}

事实上,我在寻找一种程序化的方法。很抱歉在我的问题中忘记提到它。警告:如果您有多个Tomcat和会话集群,这将不起作用。您还需要在Tomcat中分发userId->HttpSession映射。
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();
}