gpt4 book ai didi

jsf - 使特定用户的 session 无效

转载 作者:行者123 更新时间:2023-12-04 20:16:41 26 4
gpt4 key购买 nike

所以对于我的网络应用程序,如果我删除当前登录的用户,并且我想让他/她的 session 无效。因此,一旦他/她刷新页面或导航,他们就不再登录。我现在的方式是,如果用户成功登录,我会将用户对象存储在我的 SessionScoped bean,并将HttpSession存储到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);
}

这是正确的做法吗?如果是这样,我该如何清理我的应用程序映射?

最佳答案

Is this a correct approach?

基本上有两种方式。

  1. 通过用户 ID 将 HttpSession 句柄作为键存储在应用程序范围内,以便您可以获取它的句柄并使它无效。这可能适用于在单个服务器上运行的小型 Web 应用程序,但可能不适用于在服务器集群上运行的 Web 应用程序,具体取决于其配置。

    我只会将它存储在应用程序范围内的另一个映射中,而不是像您那样直接存储在应用程序范围内,这样您就可以更轻松地了解所有用户并且可以保证例如,任意用户 ID 不会与现有应用程序范围内的托管 bean 名称冲突。

  2. 将新的 bool 值/位列添加到与每个 HTTP 请求都检查的用户关联的某个数据库表中。如果管理员将其设置为 true,则与请求关联的 session 将失效,数据库中的值将设置回 false


how do I clean up my application map?

你可以使用 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);
}
}

关于jsf - 使特定用户的 session 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com