繁体   English   中英

如何检查哪些所有用户已登录到我的应用程序

[英]How can i check which all users are logged into my application

我有一个基于Web的应用程序,使用用户名和密码登录。

现在,我该如何检查特定时间所有用户当时都已登录。 我正在使用会话管理,并且应用程序中没有使用DB,所有文件系统都在文件系统中

编辑:1更愚蠢的疑问..如何在应用程序范围内定义变量..这是这种吗?

<env-entry>
<env-entry-name>test/MyEnv2</env-entry-name>
<env-entry-type>java.lang.Boolean</env-entry-type>
<env-entry-value>true</env-entry-value>
</env-entry>

只需将所有已登录的用户收集到应用程序范围内的Set中即可。 如果您的应用程序设计良好,则应该有一个Javabean User ,它代表登录用户。 让它实现HttpSessionBindingListener并在会话中将要绑定/解除绑定的用户从Set添加/删除用户。

开球示例:

public class User implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
        logins.add(this);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
        logins.remove(this);
    }

    // @Override equals() and hashCode() as well!

}

请注意,您需要在应用程序范围内准备Set ,以便在上述方法中它不会返回null 您可以通过nullcheck或在ServletContextListener#contextInitialized()帮助下以相同的方法执行此操作。

然后,在您可以访问ServletContext应用程序中的任何地方(例如在Servlet中),您都可以按以下方式访问登录的用户:

Set<User> logins = (Set<User>) getServletContext().getAttribute("logins");

更新资料

BalusC的方法更合适,通过这种方法,您将不会获得未登录用户的会话。 为此,您需要跟踪HttpSessionBindingListener。

您可以实现HttpSessionListener并可以跟踪已登录的用户

 public void sessionCreated(HttpSessionEvent se) {
  // adding logging in user to some application data map or inserting it to DB
 }

 public void sessionDestroyed(HttpSessionEvent se) {
  // remove logged in user to some application data map or inserting it to DB
 }

一种更可扩展的解决方案是在数据库中的用户表中添加一列“ loggedIn”,并在您登录用户时将其设置为true。这将使应用程序服务器膨胀,并且如果您的应用程序也支持分布式环境将来需要运行多个框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM