首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通知所有用户的@SessionScoped-Beans实例

通知所有用户的@SessionScoped-Beans实例
EN

Stack Overflow用户
提问于 2014-08-27 15:07:07
回答 1查看 351关注 0票数 2

我的问题

我有一个@SessionScoped sessionInformationBean,它保存一个来自登录用户的Person-Entity。因此,如果用户登录,我将查找相应的Entity并放入@SessionScoped CDI。此Bean用于在代码中的任意位置检索当前用户( Person-Entity),以便您可以检查它是否是管理员或类似的东西。

代码语言:javascript
复制
@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上。

代码语言:javascript
复制
EventBus eventBus = EventBusFactory.getDefault().eventBus();
eventBus.publish("/session", "test");

我认为push和WebSockets的目的是通知所有用户或会话。

我该怎么办?

因此,问题是:如何访问特定@SessionScopedBean的所有实例?我只想从每个登录用户访问sessionInformationBean,并将currentUser设置为null

EN

回答 1

Stack Overflow用户

发布于 2014-08-30 19:34:31

我想不出有什么办法能做到这一点。我建议的是添加一个ApplicationScoped bean。每当您的SessionScoped bean被创建时,请在这个应用程序范围内注册它。当您想要处理此事件时,遍历所有这些对象。

不过,我很好奇,当您有多台服务器时会发生什么呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25530724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档