在我们的 Web 应用程序中(在使用 Struts 的 JBoss 中)我们使用会话主要是为了安全以及为用户缓存一些数据。因此,每个登录到应用程序的用户都有一个会话,其中缓存了不同的数据。
基于一些参数更改,我想更改已登录用户子集的缓存(即有会话)
这可以实现吗?到目前为止,我无法从一般搜索中找到任何东西。
你可以使用一个HttpAttributeListener
这里是一个基本的例子
HttpSessionAttributeListener:
HttpSessionAttributeListener 接口使对象能够监视给定 Web 应用程序中会话属性列表的更改。HttpSessionAttributeListener 又扩展了 java.util.EventListener。其中的方法是
- attributeAdded(HttpSessionBindingEvent se) - 这是属性已添加到会话的通知。
- attributeRemoved(HttpSessionBindingEvent se) - 这是属性已从会话中删除的通知。
- attributeReplaced(HttpSessionBindingEvent se) - 这是在会话中属性已被替换的通知。
您可以通过将每个会话对象存储static List<Session>
在某个持有者对象中来实现。你可以把它放在一个HttpSessionListener#sessionCreated(..)
. 记得把它从列表中删除sessionDestroyed(..)
然后,每当您想做某事时,只需循环先前存储的会话列表,然后对它们做任何您想做的事情。
你基本上有2个选择:
推动更改。获取HttpSession
应用程序范围地图中的所有实例,您在HttpSessionListener
. 这样您就可以从应用程序范围中获取它们并遍历它们以直接进行必要的更改。
轮询更改。在应用程序范围内存储更改指令。在每个 HTTP 请求的帮助下检查Filter
是否ServletRequestListener
需要更改,然后在当前会话中进行必要的更改并删除/禁用更改指令。
一个完全不同的替代方案是使用应用程序范围的共享缓存,例如 Terracotta 或 Ehcache,这样您就不需要在所有 HTTP 会话中复制相同的数据。您只需要按请求处理数据。当使用 JPA 访问数据库时,请继续阅读“二级缓存”,这正是它的作用。