栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

当用户使用相同的凭据登录两次时,如何使用户会话无效

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

当用户使用相同的凭据登录两次时,如何使用户会话无效

与数据库无关的方法是让变量

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
地图中删除。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/427861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号