当前位置: 首页 > 面试题库 >

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

松安民
2023-03-14
问题内容

我正在将JSF 1.2与Richfaces和Facelets结合使用。

我有一个包含许多会话范围的bean和一些应用程序bean应用程序

假设用户使用Firefox登录。使用ID =“ A”创建会话;然后,他打开Chrome并使用相同的凭据再次登录。使用ID =“ B”创建一个会话。

创建会话“ B”时,我希望能够销毁会话“ A”。怎么做?

也。当Firefox中的用户执行任何操作时,我希望能够显示一个弹出窗口或某种通知,指出“您已注销,因为您已从其他地方登录”。

我有一个sessionListener,它跟踪创建和销毁的会话。问题是,我可以将HTTPSession对象保存在应用程序范围的Bean中,并在检测到用户两次登录后销毁它。但是有些事情告诉我,这是错误的,并且行不通。

JSF是否在服务器端某个位置跟踪会话?如何通过标识符访问它们?如果不是,当用户两次登录时如何踢出用户的第一次登录?


问题答案:

与数据库无关的方法是让变量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地图中删除。



 类似资料:
  • 我已经按照你在这篇博客中提到的步骤进行了操作。对于基本dn,他们给出了类似于'base dn-dc=,dc='的内容,但我给出了类似于'ecompany.local'的内容。因为我不是ldap管理员,所以我给了主体作为我的ldap id和我的ldap密码。当我单击test connection时,弹出窗口显示“Liferay已成功连接到LDAP服务器”。 重新启动了服务器。 点击登录。输入ldap

  • 我正在使用hybridauth库。 Hybridauth文档说,通过存储会话数据,可以实现持久会话。 假设我在数据库中存储了用户会话数据。它包含oauth令牌、oauth刷新令牌等。。 使用oauth令牌,无需询问用户权限即可联系oauth服务器。 现在一切都好了。现在,如果用户登录到谷歌,如何准确地自动登录用户? ?

  • 本文向大家介绍使用redis管理用户登录会话的方法,包括了使用redis管理用户登录会话的方法的使用技巧和注意事项,需要的朋友参考一下 登录和cookie缓存 对于用来登录的cookie,有两种常见的方法可以将登录信息存储在cookie里面:一种是签名(signed)cookie,另一种是令牌(token)cookie。 签名cookie通常会存储用户名,可能还有用户ID、用户最后一次成功登陆的时

  • 最初的应用程序使用了基于XML的配置,所以我选择继续这样做。应用程序被设置为使用DAOAuthProvider,如果登录失败,则使用LDAP身份验证Provider。 我移植了应用程序,现在它启动了。我可以使用带有InMemoryDaoImpl bean的DaoAuthenticationProvider登录到应用程序,该bean保存凭据和角色。 但是,我面临的问题是: 日志段: 2014-07-

  • 问题内容: 我有一个完全由Weblogic容器保护的Web应用程序。现在,我必须列出当前登录的用户。我必须为此使用Spring Security 2.0.4 在web.xml中,我定义了必要的侦听器和过滤器: 之后,按照我的理解,我定义了bean: 最后,我编写了一个简单的JSP页面,其中列出了用户: 这是我的帮助程序类尝试获取用户列表的方式: 不幸的是,所有这些都不起作用,我也不知道该如何调试。

  • 问题内容: 以下是允许用户将数据存储到Firestore中的代码。问题是,登录到该应用程序的所有用户都可以查看上传的数据。我如何才能仅允许当前登录的用户仅存储其帐户的数据? 对于Firebase数据库,我使用以下代码(有效,但不适用于Firestore) FirebaseUser用户= FirebaseAuth.getInstance()。getCurrentUser(); 字符串userId =