Tha*_*ham 2 session jsf login invalidation
因此,对于我的webapp,如果我删除当前登录的用户,并且我想使他/她的会话无效.因此,只要他/她刷新页面或导航,他们就不再登录.我现在的方式是,如果用户成功登录,我将把用户对象存储在我的SessionScopedbean中,并将其存储HttpSession到Application Map.以下是我的代码
这是我的SessionScoped豆子
@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);
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?如果是这样,我该如何清理我的应用程序图?
这是正确的方法吗?
基本上有两种方式.
HttpSession通过用户ID作为键将句柄存储在应用程序范围中,以便您可以获取它并使其无效.这可能适用于在单个服务器上运行的小型Web应用程序,但可能无法在服务器群集上运行的Web应用程序上运行,具体取决于其配置.
我只会将它存储在应用程序范围中的另一个映射中,而不是像您一样直接存储在应用程序范围中,这样您就可以更轻松地获得所有用户的概述,并且可以保证任意用户ID不会与之冲突例如,现有的应用程序范围的托管bean名称.
将一个新的布尔/位列添加到与每个HTTP请求上检查的用户关联的某个DB表中.如果管理员将其设置为true,则与请求关联的会话将失效,并且DB中的值将被设置回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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2650 次 |
| 最近记录: |