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

时间:2011-01-04 11:13:03

标签: java session servlets java-ee

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

现在我如何检查所有用户在该时间登录的特定时间。 我正在使用会话管理,在应用程序中没有使用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>

2 个答案:

答案 0 :(得分:4)

只需收集应用范围内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");

答案 1 :(得分:2)

更新

BalusC's approch更合适,通过这种方法,您将获得没有登录用户的会话。要做到这一点,你需要跟踪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
 }