Вот базовый начальный пример того, как вы можете сделать это, когда вы используете 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>
Пользовательский компонент bean: com.example.UserManager
@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";
}
// ...
}
Прослушиватель выхода из системы (и сеанса недействительным): 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>