Jsf 如何使用j_security_check获取连接用户的数量及其角色?
我通过托管bean以这种方式获取连接用户的用户名(使用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} 但是我想没有办法获得连接用户的数量并获得他们的角色。 换句话说,除了用户名之外,我还想显示用户角色和连接的用户数。 我怎
......
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>