因此,对于我的网络应用程序,如果我删除当前登录的用户,并且我想使他/她的会话无效。这样,一旦他/她刷新页面或导航,他们就不再登录。我现在的方式是,如果用户成功登录,我会将用户对象存储在我的SessionScoped
豆,并存储HttpSession
to the Application Map
。下面是我的代码
这是我的SessionScoped
bean
@PostConstruct
public void init() {
User user = UserDAO.findById(userId, password);
Map<String, Object> appMap = FacesContext.getCurrentInstance().
getExternalContext().getApplicationMap();
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().
getExternalContext().getSession(false);
appMap.put(userId, session);
}
这是正确的做法吗?如果是这样,我该如何清理我的应用程序地图?
这是正确的做法吗?
基本上有两种方法。
-
存储HttpSession
在应用程序范围内以用户 ID 作为键,这样您就可以获取它的句柄并使之无效。这可能适用于在单个服务器上运行的小型 Web 应用程序,但可能不适用于在服务器集群上运行的 Web 应用程序,具体取决于其配置。
我只会将其存储在another在应用程序范围中映射,而不是像您那样直接在应用程序范围中映射,以便您可以更轻松地获得所有用户的概述,并且可以保证任意用户 ID 不会与现有应用程序范围的托管 bean 名称冲突, 例如。
将新的布尔/位列添加到与用户关联的某个数据库表中,该表会在每个 HTTP 请求上进行检查。如果管理员将其设置为true
,那么与请求关联的会话将失效,并且数据库中的值将被设置回false
.
如何清理我的应用程序地图?
你可以使用HttpSessionListener#sessionDestroyed()为了这。例如。
public void sessionDestroyed(HttpSessionEvent event) {
User user = (User) event.getSession().getAttribute("user");
if (user != null) {
Map<User, HttpSession> logins = (Map<User, HttpSession>) event.getSession().getServletContext().getAttribute("logins");
logins.remove(user);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)