JSF Listing Active Users
Created: 15.10.2013
Listing all active users can be a useful feature for Web 2.0 applications. To realize such a feature, you need an ApplicationScoped ManagedBean that tracks all user logins.
@ManagedBean
@ApplicationScoped
public class ActiveUserHandler {
private List activeUsers = new ArrayList<>();
public void addUser(User user){
activeUsers.add(user);
}
public void removeUser(User user){
activeUsers.remove(user);
}
public List getActiveUsers(){
return activeUsers;
}
}
Every time a user logs in or logs out, the ApplicationScoped Handler needs to be notified. You might use a SessionScoped LoginHandler like this:
@ManagedBean
@SessionScoped
public class LoginHandler implements HttpSessionListener{
@PersistenceContext
private EntityManager em;
@Resource
private UserTransaction utx;
@ManagedProperty(value="#{activeUserHandler}")
private ActiveUserHandler activeUserHandler;
private String username = "";
private String password = "";
private User currentUser = null;
public String login(){
TypedQuery<User> query = em.createQuery("select u from User u where u.username=:username, User.class);
query.setParameter("username", username);
try{
User result = query.getSingleResult();
String hashedPassword = SecurityUtils.hashPasswordAndSalt(password + currentUser.getSalt());
if(currentUser.getPassword().equals(hashedPassword)){
currentUser = result;
activeUserHandler.addUser(currentUser);
return "/welcome.xhtml?faces-redirect=true";
} else {
return "/login.xhtml?faces-redirect=true";
}
} catch (NoResultException e){
return "/login.xhtml?faces-redirect=true";
}
}
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "/index.xhtml?faces-redirect=true";
}
@Override
public void sessionCreated(HttpSessionEvent e){
}
@Override
public void sessionDestroyed(HttpSessionEvent e){
activeUserHandler.removeUser(currentUser);
currentUser = null;
}
}}