【发布时间】:2014-10-21 05:58:20
【问题描述】:
我的问题
我有一个@SessionScopedsessionInformationBean,它包含一个来自登录用户的Person-Entity。因此,如果用户登录,我将查找相应的Entity 并放入@SessionScoped CDI Bean。此 Bean 用于在代码中的任何位置检索当前用户(Person-Entity),以便您检查它是否是管理员或类似的东西。
@Inject
private PersonFacade personFacade;
private Person currentUser;
public Person getCurrentUser() {
if (currentUser == null) {
String loginname = FacesContext.
getCurrentInstance().
getExternalContext().getRemoteUser();
currentUser = personFacade.findByLoginname(loginname);
}
return currentUser;
}
但是设置案例,管理员正在给这个登录用户(Person-Entity)一些管理员权限并将他保存到数据库中。在这种情况下,@SessionScoped Bean 上的 Person 不会更新,因此已经登录的用户在刷新页面后看不到他的管理员权限。那就是问题所在。为了避免这个问题,我每次访问@SessionScoped bean 时都会从数据库中获取新用户(没有激活缓存)。
我想要什么
但我想缓存他并避免每次访问数据库。所以,我想,如果有人保存用户,我会简单地注意到所有sessionInformationBean-Instances 并将currentUser-Attribute 设置为null。所以,下一次调用,他们再次从数据库中获取它并缓存它,直到它再次从我的Person.save()-Operation 设置为null。
我尝试了什么
但这似乎有点棘手。我以为我可以用 CDI-Events 处理它,但它们只会被推送到用户的sessionInformationBean,即编辑另一个用户。
也许与我的问题有关:CDI Events observed across sessions
然后我想……好吧……让我们用 Primefaces-Push 来做吧。但同样的事情.. 事件刚刚来到我自己的sessionInformationBean。
EventBus eventBus = EventBusFactory.getDefault().eventBus();
eventBus.publish("/session", "test");
我认为推送和 WebSockets 的目的是通知所有用户或会话。
我该怎么办?
所以,问题是:如何访问特定@SessionScopedBean 的所有实例?我只想访问每个登录用户的sessionInformationBean,并将currentUser设置为null。
【问题讨论】: