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