【问题标题】:Notify all @SessionScoped-Beans-Instances from all Users通知所有用户的所有@SessionScoped-Beans-Instances
【发布时间】: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

【问题讨论】:

    标签: jsf cdi


    【解决方案1】:

    没有我能想到的内置方式来做到这一点。我建议添加一个ApplicationScoped bean。每当创建 SessionScoped bean 时,将其注册到此应用范围 bean。当您要处理此事件时,请遍历所有这些对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2012-04-24
      • 2019-07-28
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多