从ServletContainer或ApplicationServer检索打开的会话数

时间:2013-06-04 13:29:22

标签: java session java-ee servlets

我需要知道登录用户的活动会话数。通过HttpServletRequest我可以检索当前登录的主体 - > getUserPrincipal()。有没有办法查询该主体的活动会话数?

1 个答案:

答案 0 :(得分:1)

我不认为servlet Api提供此功能。但你可以通过功能来实现。

创建用户和会话对象的地图。

Map<User, HttpSession> logggedUserMap = new HashMap<User, HttpSession>();

在用户登录时添加条目,并在注销时将其删除。

所以logggedUserMap.size()值是总开放用户会话。

使用HttpSessionBindingListener,它将跟踪会话中绑定或未绑定的代码会话属性中的任何位置。

创建课程

class SessionObject implements HttpSessionBindingListener {
        String message = "";
        User loggedInUser;
        Logger log = Logger.getLogger(SessionObject.class);
        public SessionObject(User loggedInUser) {
            this.loggedInUser=loggedInUser;
        }

        public void valueBound(HttpSessionBindingEvent event) {
            log.info("=========in valueBound method==============");
            HttpSession session =LoggedInUserSessionUtil.getLogggedUserMap().get(loggedInUser);
            try{
                if (session != null && session.getLastAccessedTime() != 0) {
                    message = "ALL_READY_LOGGEDIN";
                    return;
                }
            }catch(IllegalStateException e){
                e.printStackTrace();
                session = LoggedInUserSessionUtil.removeLoggedUser(loggedInUser);
            }
            System.out.println("*************************************"+event.getSession().getId() +"------"+loggedInUser+"*********************************************");
            log.info("=========valueBound putting in user map==============");
            LoggedInUserSessionUtil.getLogggedUserMap().put(loggedInUser, event.getSession());
            return;
        }

        public void valueUnbound(HttpSessionBindingEvent event) { 
             // This work already doing in Force logout servlet
             }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;


        }
    }

在用户登录时绑定此对象实例。

SessionObject sessionObj = new SessionObject(loggedInUser);
req.getSession().setAttribute("Binder.object",sessionObj);