与数据库无关的方法是让变量
User具有一个
static Map<User,HttpSession>变量并实现
HttpSessionBindingListener(and
Object#equals()和
Object#hashCode())。这样,您的webapp在意外崩溃后仍然可以运行,这可能导致数据库值无法更新(您当然可以创建一个
ServletContextListener在webapp启动时重置数据库的,但这只是越来越多的工作)。
这是
User应该的样子:
public class User implements HttpSessionBindingListener { // All logins. private static Map<User, HttpSession> logins = new ConcurrentHashMap<>(); // 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); }}当您登录时
User,如下所示:
User user = userDAO.find(username, password);if (user != null) { sessionMap.put("user", user);} else { // Show error.}然后它将调用,
valueBound()该操作将从
logins地图中删除任何以前登录的用户并使该会话无效。
当您注销时
User,如下所示:
sessionMap.remove("user");或会话超时时,
valueUnbound()将调用,将用户从
logins地图中删除。



