日期:2014-05-18  浏览次数:20823 次

关于HttpSessionBindingListener的valueUnbound问题
大家好,我用HttpSessionBindingListener监听用户的登录及注销,在测试的时候,发现登录是没有问题的,即每次有新用户登录时,都会进入到valueBound方法,但是当用户注销时,valueUnbound中,只进来一次,即我连续注销几个用户,只有注销第一个时才会进入valueUnbound方法,其余的均不进去。
  请教各位,有没有遇到过这个问题,该如何解决呢?(既然登录测试顺利通过,且注销一次也可以,说明我的代码应该没问题的啊),以下是我的代码,各位不妨一看:
Java code

// 这是监听器代码
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;
    }


请指教,谢谢~~

------解决方案--------------------
退出销毁session应该使用HttpSessionListener的sessionDestroyed方法啊, 
也就是说你应该使用HttpSessionListener接口