我正在使用带有 Richfaces 和 Facelets 的 JSF 1.2。
我有一个应用程序,其中包含许多会话范围的 Bean 和一些应用程序 Bean。
假设用户使用 Firefox 登录。创建一个会话,ID=“A”;
然后他打开 Chrome 并使用相同的凭据再次登录。创建一个 ID=“B”的会话。
创建会话“B”时,我希望能够销毁会话“A”。怎么做?
还。当 Firefox 中的用户执行任何操作时,我希望能够显示弹出窗口或某种通知,显示“您已注销,因为您已从其他地方登录”。
我有一个 sessionListener 来跟踪创建和销毁的会话。问题是,我可以将 HTTPSession 对象保存在应用程序范围的 bean 中,并在检测到用户登录两次时销毁它。但有件事告诉我这是错误的并且行不通。
JSF 是否在服务器端的某个位置跟踪会话?如何通过标识符访问它们?如果不是,如何在用户登录两次时踢出第一次登录?
独立于数据库的方法是让User
have a static Map<User, HttpSession>
变量和实现HttpSessionBindingListener https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSessionBindingListener.html (and Object#equals() http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object- and Object#hashCode() http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--)。这样,您的 web 应用程序在意外崩溃后仍然可以运行,这可能会导致数据库值无法更新(您当然可以创建一个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
map.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)