【问题标题】:Fail to retrieve value from HashMap with HttpSession as key以 HttpSession 为键无法从 HashMap 中检索值
【发布时间】:2013-03-12 14:48:39
【问题描述】:

我有一个 HashMap,我将 HttpSession 对象作为键,将 HashSet 作为值

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,即使映射中存在会话对象(手动检查映射条目)。我被卡住了!!!

【问题讨论】:

  • 你应该使用不可变对象作为关键,在这种情况下你不能保证基于HttpSession实现的相等性所以使用Stringid返回的getId()
  • 您要为地图分配什么价值,请同时显示该代码。因为当我们打开页面时会话 id 是不同的,并且在成功登录后会话 id 变成了其他东西。所以请告诉我你的 hashmap 是如何创建的
  • //一些代码 HttpSession session = request.getSession(true); HashSet set = new HashSet(); if(session.isNew()) map.put(session, set); //一些代码
  • 当您将对象放入地图和从HttpSessionEvent 检索对象时,请尝试打印对象的hashcode。看看它们是否不同。
  • @Santosh 你是对的 HashCode 是不同的,尽管两者的状态似乎相同。

标签: java hashmap httpsession


【解决方案1】:

如果在之前的请求中将该值放入映射中,那么您现在拥有的 HttpSession 对象不一定与映射中存在的相同(即使它们代表相同的会话)。同一会话的两个表示不需要 (AFAIK) 是 equals 或具有相同的 hashCode,这会破坏地图。

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

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2016-12-30
    • 2017-06-06
    • 2012-06-18
    • 2017-08-29
    相关资源
    最近更新 更多