关于HttpSessionBindingListener的valueUnbound问题
大家好,我用HttpSessionBindingListener监听用户的登录及注销,在测试的时候,发现登录是没有问题的,即每次有新用户登录时,都会进入到valueBound方法,但是当用户注销时,valueUnbound中,只进来一次,即我连续注销几个用户,只有注销第一个时才会进入valueUnbound方法,其余的均不进去。
请教各位,有没有遇到过这个问题,该如何解决呢?(既然登录测试顺利通过,且注销一次也可以,说明我的代码应该没问题的啊),以下是我的代码,各位不妨一看:
// 这是监听器代码public class UserListener implements HttpSessionBindingListener { private final static String ON_LINE_USERS = "onLineUsers"; private final static String CURRENT_USER = "currentUser"; private Integer userId; // 当有用户登录时,便把该用户信息保存在当前servlet上下文的map中 public void valueBound(HttpSessionBindingEvent event) { User user = (User) event.getSession().getAttribute(CURRENT_USER); if (null != user) { Map onLineUsers = getMap(event); onLineUsers.put(user.getId(), user); userId = user.getId(); event.getSession().getServletContext().setAttribute(ON_LINE_USERS, onLineUsers); } } // 当有用户退出时,便从当前servlet上下文中清除该用户信息 public void valueUnbound(HttpSessionBindingEvent event) { Map onLineUsers = getMap(event); onLineUsers.remove(userId); event.getSession().getServletContext().setAttribute(ON_LINE_USERS, onLineUsers); } //得到用来存储用户的map对象 public Map getMap(HttpSessionBindingEvent event) { Map map = (Map) event.getSession().getServletContext().getAttribute(ON_LINE_USERS); if (null == map) { map = new HashMap(); } return map; }}// 这是注销的代码(我用了struts1)public ActionForward quit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { request.getSession().setAttribute(CURRENT_USER, null); request.getSession().removeAttribute(USER_LISTENER); return null; }