我的问题
我有一个@SessionScoped sessionInformationBean,它保存一个来自登录用户的Person-Entity。因此,如果用户登录,我将查找相应的Entity并放入@SessionScoped CDI。此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)一些管理权限,并将其保存到数据库中。在这种情况下,Person在@SessionScoped Bean上没有更新,因此已经登录的用户在刷新页面后没有看到他的管理员权限。这就是问题所在。为了避免这个问题,我从数据库中获取用户对@SessionScoped bean的每次访问(没有缓存激活)。
我想要的
但我想缓存他,避免每次访问数据库。因此,我想,如果有人保存了一个用户,我只需注意到所有的sessionInformationBean-Instances,并将currentUser-Attribute设置为null。因此,在下一次调用中,他们再次从数据库中获取它,并将其缓存,直到它再次从MyPerson.save()-Operation设置为Person.save()。
我试过的
但这似乎有点棘手。我以为我可以用CDI-事件来处理它,但它们只会被推到用户的sessionInformationBean上,即编辑其他用户。
也许和我的问题有关:CDI Events observed across sessions
然后我想..。好的..。让我们用Primefaces-Push来做。但同样的事情..。这些事件正在发生在我自己的sessionInformationBean上。
EventBus eventBus = EventBusFactory.getDefault().eventBus();
eventBus.publish("/session", "test");我认为push和WebSockets的目的是通知所有用户或会话。
我该怎么办?
因此,问题是:如何访问特定@SessionScopedBean的所有实例?我只想从每个登录用户访问sessionInformationBean,并将currentUser设置为null。
发布于 2014-08-30 19:34:31
我想不出有什么办法能做到这一点。我建议的是添加一个ApplicationScoped bean。每当您的SessionScoped bean被创建时,请在这个应用程序范围内注册它。当您想要处理此事件时,遍历所有这些对象。
不过,我很好奇,当您有多台服务器时会发生什么呢?
https://stackoverflow.com/questions/25530724
复制相似问题