代码之家  ›  专栏  ›  技术社区  ›  endryha

如何在Java中访问HTTP会话

  •  6
  • endryha  · 技术社区  · 16 年前

    如何以优雅的方式通过id获取任何http会话或web应用程序(java2ee)中所有当前活动的http会话?

    目前我有一个 WebSessionListener 一旦创建了会话,我就把它放进去 ConcurrentHashMap() (map.put(sessionId, sessionObj)) ,一切正常,我可以随时通过会话id从该映射检索HTTP会话,但看起来 HttpSession 对象永远不会完成。。。即使会话已失效,映射仍然引用在失效的会话对象上。。。我也读过 this article WeakHashMap 对我来说是不可接受的。。。

    会话 从那里检索一些属性。。。

    更新

    有时用户执行一些可能影响其他并发用户工作的操作/请求,例如管理员应禁用用户帐户,但该用户当前正在与系统一起工作,在这种情况下,我需要向管理员显示一条消息,例如“用户XXX当前正在使用系统”,因此我需要检查持有用户XXX凭据的HttpSession是否已经存在并处于活动状态。所以这就是我需要这种可能性来获得任何http会话甚至所有会话的原因。

    我很担心可能会发生的内存问题,我想和某人讨论一下,但目前我清楚地看到,一切都应该正常工作,因为当调用sessionDestroyed()方法时,所有失效的会话都将从映射中删除。。。

    非常感谢您的重播,但现在我明白了问题只是想象:)

    3 回复  |  直到 13 年前
        1
  •  7
  •   BalusC    13 年前

    根据您的澄清:

    有时用户执行一些可能影响其他并发用户工作的操作/请求,例如管理员应禁用用户帐户,但该用户当前正在与系统一起工作,在这种情况下,我需要向管理员显示一条消息,例如“用户XXX当前正在使用系统”,因此我需要检查持有用户XXX凭据的HttpSession是否已经存在并处于活动状态。所以这就是我需要这种可能性来获得任何http会话甚至所有会话的原因。

    为此,你实际上不需要知道任何关于会议的事情。您只需要知道哪些用户已登录。为此,您可以完全让模型对象 实施 HttpSessionBindingListener User 作为会话属性建模。

    public class User implements HttpSessionBindingListener {
    
        @Override
        public void valueBound(HttpSessionBindingEvent event) {
            Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
            logins.add(this);
        }
    
        @Override
        public void valueUnbound(HttpSessionBindingEvent event) {
            Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
            logins.remove(this);
        }
    
        // @Override equals() and hashCode() as well!
    
    }
    

    ServletContext :

    Set<User> logins = (Set<User>) servletContext.getAttribute("logins");
    
        2
  •  5
  •   Andrzej Doyle    16 年前

    一般来说,servlet容器将有自己的会话管理器,它负责维护会话的生命周期,并将传入的请求与适当的会话相关联(通过cookies、锚参数、它想要的任何策略)。

    优雅的方法是以任何允许的方式连接到这个会话管理器。例如,您可以将默认的子类化,以允许您访问任意会话。

    然而,听起来您所做的似乎掩盖了体系结构的潜在问题。会话中包含的数据应该特定于该会话,因此一般来说,您不需要为了提供web应用程序的标准逻辑而查找任意的数据。而管理/内务管理任务通常由容器为您处理—因此,您也不需要干涉这一点。

    如果你暗示 为什么? 如果您想要访问任意会话,则很可能有另一种方法更适合您的目标。

        3
  •  4
  •   Carl Smotricz    16 年前

    HttpSessionListener - example code .

    你用你的 web.xml 将会话侦听器注册为应用程序的生命周期侦听器。

    您可以使用 ServletContext