2013-03-12 36 views
0

我有一个HashMap那里我把HttpSession对象作为重点和HashSet的作为价值失败与HttpSession中检索从HashMap中值为键

HashMap<HttpSession, HashSet<String>> map = new HashMap<HttpSession, HashSet<String>>(); 

我有一个HttpSession监听器,我需要检查天气会话对象存在于地图中

public void sessionDestroyed(HttpSessionEvent se) { 
    HashMap<HttpSession, HashSet<String>> map = //Get map object 
    HttpSession session = se.getSession(); 
    if(map.containsKey(session)){ 
     //TODO Code goes here 
    } 
} 

即使会话对象在地图中可用(手动检查地图项),IF条件始终返回false。我卡住了!

+1

你应该使用不可移植的对象作为关键在这种情况下,你不能保证基于'HttpSession'实现的平等性,所以使用由[getId()]返回的字符串''id(http://docs.oracle.com/ javaee/5/api/javax/servlet/http/HttpSession.html#getId()) – 2013-03-12 06:50:07

+0

你对你的地图有什么价值,请显示该代码。因为当我们打开时间会话id不同的页面并且在成功登录会话ID成为别的之后。所以请让我知道你的hashmap是如何创建的 – 2013-03-12 06:52:41

+0

//某些代码 HttpSession session = request.getSession(true); HashSet set = new HashSet (); (session.isNew()) map.put(session,set);如果(session.isNew()) //某些代码 – user1448652 2013-03-12 07:08:00

回答

2

如果将值放入先前请求的地图中,则您现在拥有的HttpSession对象不一定与地图中存在的对象相同(即使它们表示相同的会话)。同一会议的两个表示不需要(AFAIK)为equals或具有相同的hashCode,这将打破地图。

您可以尝试使用session.getId()值作为关键字。