Jsf 如何使用j_security_check获取连接用户的数量及其角色?

Jsf 如何使用j_security_check获取连接用户的数量及其角色?,jsf,java-ee-5,j-security-check,userprincipal,Jsf,Java Ee 5,J Security Check,Userprincipal,我通过托管bean以这种方式获取连接用户的用户名(使用j_security_check): ...... username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName(); 然后在jsf页面中这样显示:{userBean.username} 但是我想没有办法获得连接用户的数量并获得他们的角色。 换句话说,除了用户名之外,我还想显示用户角色和连接的用户数。 我怎

我通过托管bean以这种方式获取连接用户的用户名(使用j_security_check):

......
    username =   FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
然后在jsf页面中这样显示:
{userBean.username}
但是我想没有办法获得连接用户的数量并获得他们的角色。 换句话说,除了用户名之外,我还想显示用户角色和连接的用户数。 我怎样才能做到这一点!? 提前感谢您的帮助

编辑: 现在,我可以在托管bean中使用namedquery获得连接用户的角色:

public Users getUserRole(){
      try {
            Users auser = (Users)
            em.createNamedQuery("Users.findByUsername").
                    setParameter("username", getRemoteUser()).getSingleResult();
            return auser; 
        } catch (NoResultException nre) {
            JsfUtil.addErrorMessage(nre, "getUserRole Error");
            return null;
        }

    }
在xhtml页面中:

<h:outputLabel for="rolefacet" value="Role: "/>
  <h:outputFormat id="rolefacet" value="#{UserBean.userRole.ugroup}" /> 
获取已连接用户的数量

我假设您的意思是获取登录用户的数量

基本上,您需要在应用程序范围内设置所有已登录用户的
,并在其登录时向其添加
用户
,在其注销或会话被破坏时删除
用户
。下面是一个使用应用程序范围的托管bean的示例

@ManagedBean(eager=true)
@ApplicationScoped
public class LoginManager implements Serializable {

    private Set<User> users = new HashSet<User>();

    public Set<User> getUsers() {
        return users;
    }

}
最后,要从登录中删除用户,最好是挂接,假设您在注销时使会话无效。会话到期时也将调用此函数

public void sessionDestroyed(HttpSessionEvent event) {
    User user = (User) event.getSession().getAttribute("user");
    if (user != null) {
        LoginManager loginManager = (LoginManager) event.getSession().getServletContext().getAttribute("loginManager");
        loginManager.getUsers().remove(user);
    }
}

下面是一个基本的开始示例,当您使用Servlet 3.0时,您可以如何使用新的
HttpServletRequest#login()
API进行编程登录

登录表单:
login.xhtml

<h:form>
    <h:inputText value="#{user.username}" />
    <h:inputSecret value="#{user.password}" />
    <h:commandButton value="Login" action="#{user.login}" />
    <h:messages />
</h:form>
注销(和会话无效)侦听器:
com.example.LogoutListener

@WebListener
public class LogoutListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        UserManager userManager = (UserManager) event.getSession().getAttribute("user");
        if (userManager != null && userManager.getCurrent() != null) {
            userManager.getLogins().remove(userManager.getCurrent());
        }
    }

}
(不要在
logout()
方法中执行此操作!触发此操作的是会话无效,会话无效将在调用
logout()
或会话过期时发生)

在任何登录视图中,您都可以获得当前用户和登录计数,如下所示:

<p>Welcome, #{user.current.name}!</p>
<p>Total logged in users: #{user.logins.size()}</p>
欢迎,{user.current.name}

登录用户总数:#{user.logins.size()}


谢谢你,巴卢斯克!明天我将尝试此解决方案并给出反馈!我想到了一种类似的方法(使用一个实现HttpSessionListener的类和两个三个方法:void SessionCreated()、void SessionDestroyed和int GetActiveSessionNumber(){return sessions.size();}),但您的解决方案似乎更好!让我们试试!是的,您可以通过
{loginManager.count}获得视图中的登录计数
或其他,如果您提供了返回
users.getSize()的
getCount()方法
。是的,它有:在
过滤器中
您只需要将
ServletRequest
转换回
HttpServletRequest
。好的!是的!我使用了错误的属性!对不起!还有一件事,servletContext从何而来?在过滤器类中声明:servletContext servletContext=..什么;?您可以吗请@BalusC添加第二个答案(HttpServletRequest#login(),同时将用户添加到注入的LoginManager bean的集合中),考虑到我现在正在使用Servlet3.0。如果没有这么多问题!!!太好了!我想只剩下一个小版本:从
并为(密码、用户名、登录)。再次非常感谢@BalusC!你是最好的!我修复了按钮(对不起,Stackoverflow编辑器中没有类似IDE的自动完成)。getter/setter被
/…
注释覆盖,我想这很明显:)如果我没有像JavaEE5(WebSphere 7)这样的选择怎么办和JSF 2。我如何实现相同的功能,即request.login(…)?在设置的登录中维护信息多长时间?内容何时过期?@SeanCoetzee让
LoginManager
将数据存储在共享数据存储中。
@ManagedBean(name="user")
@SessionScoped
public class UserManager implements Serializable {

    private String username;
    private String password;
    private User current;

    @EJB
    private UserService userService;

    @ManagedProperty("#{loginManager.logins}")
    private Set<User> logins;

    public String login() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

        try {
            request.login(username, password);
            current = userService.find(username, password);
        } catch (ServletException e) {
            // Unknown login. Will be handled later in current==null check.
        }

        if (current == null) {
            context.addMessage(null, new FacesMessage("Unknown login"));
            return null;
        } else {
            logins.add(current)
            return "home?faces-redirect=true";
        }
    }

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "login?faces-redirect=true";
    }

    // ...
}
@WebListener
public class LogoutListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        UserManager userManager = (UserManager) event.getSession().getAttribute("user");
        if (userManager != null && userManager.getCurrent() != null) {
            userManager.getLogins().remove(userManager.getCurrent());
        }
    }

}
<p>Welcome, #{user.current.name}!</p>
<p>Total logged in users: #{user.logins.size()}</p>