Java 如何基于一个事件更新多个会话

Java 如何基于一个事件更新多个会话,java,servlets,jboss,Java,Servlets,Jboss,在我们的web应用程序中(在使用Struts的JBoss中),我们使用会话主要是为了安全以及为用户缓存一些数据。因此,每个登录到应用程序的用户都有一个会话和缓存在其中的不同数据 基于某些参数更改,我想更改已登录用户子集的缓存(即拥有会话) 这能实现吗?到目前为止,我还没有找到任何与常规搜索不同的内容。您可以使用HttpAttributeListener 一个基本的例子 HttpSessionAttributeListener: HttpSessionAttributeListener接口使对象能

在我们的web应用程序中(在使用Struts的JBoss中),我们使用会话主要是为了安全以及为用户缓存一些数据。因此,每个登录到应用程序的用户都有一个会话和缓存在其中的不同数据

基于某些参数更改,我想更改已登录用户子集的缓存(即拥有会话)


这能实现吗?到目前为止,我还没有找到任何与常规搜索不同的内容。

您可以使用
HttpAttributeListener

一个基本的例子

HttpSessionAttributeListener:

HttpSessionAttributeListener接口使对象能够 监视给定Web中会话属性列表的更改 应用HttpSessionAttributeListener反过来扩展了 java.util.EventListener。其中的方法是

  • attributeAdded(HttpSessionBindingEvent se)-这是向会话添加属性的通知
  • attributeRemoved(HttpSessionBindingEvent se)-这是从会话中删除属性的通知
  • AttributeReplace(HttpSessionBindingEvent se)-这是会话中已替换属性的通知

您可以通过将每个会话对象存储在某个holder对象的
静态列表中来实现。您可以通过一个
HttpSessionListener#sessionCreated(..)
来放置它。请记住将其从
sessionDestroyed(..)的列表中删除


然后,无论何时您想做什么,只需循环之前存储的会话列表,然后对它们执行任何操作。

您基本上有两个选项:

  • 推动改变。获取应用程序范围映射中的所有实例,您可以在应用程序范围映射的帮助下进行管理。这样,您就可以从应用程序范围中获取它们,并遍历它们,直接进行必要的更改

  • 投票表决改变。在应用程序范围中存储更改指令。对于每个HTTP请求,请在或的帮助下检查是否需要更改,然后在当前会话中进行必要的更改并删除/禁用更改指令

  • 另一种完全不同的选择是使用应用程序范围的共享缓存,如Terracotta或Ehcache,这样就不需要在所有HTTP会话上复制相同的数据。您只需要根据每个请求处理数据。当数据库访问进入JPA的图片,然后阅读关于“二级缓存”,这正是它所做的