当前位置: 首页 > 面试题库 >

如何使用Java访问HTTP会话

韩晋
2023-03-14
问题内容

如何以一种优雅的方式通过id获取任何HTTP会话或Web应用程序(Java 2 EE)中当前所有活动的HTTP会话?

当前,我有一个WebSessionListener会话,一旦创建,便将其放入ConcurrentHashMap() (map.put(sessionId, sessionObj)),一切正常,我可以随时通过会话ID从该映射中检索HTTP会话,但是看起来HttpSession对象将永远不会完成……即使会话使该映射无效仍然引用无效的会话对象…我也已经阅读了这篇文章,WeakHashMap在我看来,这是不可接受的…

换句话说,我需要一种可能性来查看任何HttpSession,甚至获取所有当前活动状态HttpSession并从中检索一些属性…

请咨询某人:)

更新资料

由于以下原因,我需要访问HttpSession对象:

有时用户执行某些操作/请求可能会影响另一个并发用户的工作,例如admin应该禁用用户帐户,但是该用户当前正在使用系统,在这种情况下,我需要向管理员显示一条消息,例如“用户XXX当前使用系统”,因此我需要检查是否存在拥有用户XXX凭证的HttpSession并已将其激活。所以这就是为什么我需要获得所有http会话甚至所有会话的可能性。

我当前的实现是:SessionManager,它了解所有会话(ConcurrentMap)和HttpSessionListener,后者将会话放入/删除到SessionManager中。

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

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


问题答案:

根据您的说明:

有时用户执行某些操作/请求可能会影响另一个并发用户的工作,例如admin应该禁用用户帐户,但是该用户当前正在使用系统,在这种情况下,我需要向管理员显示一条消息,例如“用户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");


 类似资料:
  • 我正在Codeigniter中创建API。在这个API中,我为用户提供了一个登录函数。如果登录成功,我将在CI会话中设置用户数据,并将会话返回给用户。 现在,用户可以使用该会话ID来验证他自己的所有其他请求,如添加/更新/删除。基本上,我希望当用户发送下一个请求时,我可以根据他的会话ID验证他的凭据。 客户请求代码: 上面是一个从客户端到服务器的登录请求示例。在服务器端,服务器验证客户端提供的凭据

  • 问题内容: 我用http 9200打开了几个客户端节点,以切断ElasticSearch查询/索引。我想通过http 9200从客户端记录访问日志,就像Http- Apache拥有access.log一样。我应该如何在ES中启用它。 问题答案: Elasticsearch本身没有这样的东西。 但是,如果安装Shield插件,则可以通过将其添加到配置文件中来启用审核。 然后,您将在ES日志文件夹中获

  • 问题内容: 我需要访问以获得有关某个存储库的一些数据。以下命令很好用 现在,我需要调用相同的名称来操纵输出。这是我尝试过的代码, 当我调试代码时,它向我显示此错误, HttpResponseProxy {HTTP / 1.1 400错误的请求[服务器:GitHub.com,日期:2017年2月3日,星期五,格林尼治标准时间12:14:58,内容类型:application / json; char

  • 我需要访问以获得关于某个存储库的一些数据。下面的命令可以正常工作 现在我需要在中调用相同的代码,因为我需要操作输出。下面是我尝试过的代码, 我做错了什么?你能帮我解决这个问题吗。提前致谢

  • 我想用这个curl语句做一个请求: 我想创建一个连接到Battle.net(暴雪开发者的API),但我不知道如何实现。我希望有人能帮助我。怪我英语不好。我是这个社区的新手。 错误:

  • 问题内容: 如何获得服务器上所有活动的PHP会话的列表并从一个用户实例中访问它们? 激励的情况是显示站点上所有当前活动用户的列表,用户名存储在每个用户的PHP会话中。 注意:我知道我可以通过数据库(甚至文件系统)创建自己的状态,但是我正在寻找一种利用内置PHP会话机制的方法。 问题答案: 看到响应,尽管有可能,但这并不意味着您 应该 这样做。会话的存储格式没有记录,并且可能随时更改(即使在次要版本