Si el usuario cierra el navegador sin cerrar sesión.
En particular, este caso es difícil y no es confiable para detectar. Puede utilizar el evento beforeunload
en Javascript, pero depende totalmente de si el navegador tiene habilitado JS y si el navegador en particular admite este evento no estándar (por ejemplo, Opera no). Esa es también una de las principales razones por las que sugiero simplemente desconectarse del usuario que inició sesión previamente en lugar de evitar el inicio de sesión. Eso también es más fácil de usar y seguro para el caso de que el usuario "olvide" cerrar la sesión desde la otra computadora.
La manera más fácil es dejar que el User
tienen una variable static Map<User, HttpSession>
y se deja poner en práctica HttpSessionBindingListener
(y Object#equals()
y Object#hashCode()
).
public class User implements HttpSessionBindingListener {
// All logins.
private static Map<User, HttpSession> logins = new HashMap<User, HttpSession>();
// Normal properties.
private Long id;
private String username;
// Etc.. Of course with public getters+setters.
@Override
public boolean equals(Object other) {
return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this);
}
@Override
public int hashCode() {
return (id != null) ? (this.getClass().hashCode() + id.hashCode()) : super.hashCode();
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = logins.remove(this);
if (session != null) {
session.invalidate();
}
logins.put(this, event.getSession());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
logins.remove(this);
}
}
Cuando vuelve a entrar la User
de la siguiente manera:
User user = userDAO.find(username, password);
if (user != null) {
request.getSession.setAttribute("user", user);
} else {
// Show error.
}
entonces se invocará el valueBound()
que eliminará cualquier previamente el usuario conectado en el mapa de logins
e invalidar la sesión.
Al cerrar la sesión del User
de la siguiente manera:
request.getSession().removeAttribute("user");
o cuando la sesión se mide el tiempo hacia fuera, entonces el valueUnbound()
se invocará que elimina el usuario del mapa logins
.
¿Tiene algún tipo de sistema de almacenamiento central que está utilizando para el seguimiento de los datos de usuario/sesión? Si es así, ¿qué es? – GrayWizardx
¿Está utilizando el marco de seguridad de Spring? O ha implementado el suyo propio. ¿Esta pregunta está cerrada? – Ameya