我有一个基于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>
答案 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
}