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;
    }
}}