[英]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.