【问题标题】:closing http session from other thread从其他线程关闭 http 会话
【发布时间】:2012-04-04 17:27:11
【问题描述】:

我已经使用 Spring MVC 实现了一个 Web 应用程序。 Web 应用程序集成在具有桌面用户界面的系统中。我想允许用户从 destkop GUI 关闭 Web 应用程序的会话。

我尝试实现一个不太优雅的解决方案:调用 httpsession 的 invalidate 但有时在正在运行的 http 请求中使用正在失效的会话时它会中断。当它试图调用渲染(特别是在 WebUtil.getSessionAttribute)时,它会在 DispatcherServlet 处引发 IllegalStateException,因为它试图访问会话属性并且会话已经无效。

所以我的问题是:有什么方法可以从非 http-request 线程中将用户从会话中踢出,而不会与运行 http 请求发生冲突?或者至少是我可以处理的冲突。

谢谢,

豪尔赫

【问题讨论】:

  • 嗯,我知道你可以通过 JMX 获取一些 Session 信息,例如阿帕奇雄猫。您可以使用 JMX 控制台检查您的应用程序服务器/servlet 容器。如果有可能结束会话,您可以通过编程方式使用 JMX API。
  • 谢谢@fas。我将看看 JMX API。无论如何,我想独立于 Web 应用程序服务器使用它。所以让我们看看是否有人也知道其他选择。

标签: web-applications servlets spring-mvc session-state httpsession


【解决方案1】:

您可以手动滚动一种机制,该机制涉及您希望过期的一组静态会话,以及一个检查该组的当前会话的 servlet 过滤器,然后调用 session.invalidate 并干净地重定向用户。您的桌面 API 只需向该集合添加一个会话,并且用户将在以下请求时彻底失效(在 HTTP 请求线程中)。

为了防止内存泄漏,您还需要一个侦听器在失效时从该集合中删除一个会话,从而确保该集合仅包含有效会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2013-09-12
    • 2010-10-11
    相关资源
    最近更新 更多