【问题标题】:Destroy all session variables without invalidating session java销毁所有会话变量而不使会话 java 无效
【发布时间】:2017-07-24 11:38:03
【问题描述】:

我正在尝试删除我的所有会话属性而不使会话无效,因为我需要一些像这样的会话变量:

    session.setAttribute("fatal", "fatal error");
    session.setAttribute("sgadded", "Added");
    session.setAttribute("sgverified", "Something");
    session.setAttribute("sgmodified", false);
    session.setAttribute("glexists", false);
    session.setAttribute("fatal", false);
    session.setAttribute("gladded", false);
    Enumeration em = session.getAttributeNames();
    while(em.hasMoreElements()){
        if((String)em.nextElement() != "uname"){
            session.removeAttribute((String)em.nextElement());
        }
    }

但我收到一个错误:

java.util.NoSuchElementException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:925)
    at java.util.HashMap$KeyIterator.next(HashMap.java:956)
    at java.util.Collections$2.nextElement(Collections.java:3665)

有没有更好的方法来一次删除所有会话变量而不会使会话无效。我现在不想打电话给session.invalidate()

【问题讨论】:

    标签: java session httpsession


    【解决方案1】:

    这段代码中发生了一些奇怪的事情。

    • 首先,您在while 循环中调用em.nextElement() 两次,而第二次调用em.nextElement() 并不能确保那里实际上存在另一个元素。
    • 其次,在Java中进行字符串比较时,你不应该使用==!=,这些运算符检查引用相等,你想要的是值相等,所以你需要使用.equals方法。在您的情况下,!"uname".equals((String)em.nextElement())。作为一个简短的说明,请注意我们如何在这个字符串相等中首先使用字符串文字。这是在 Java 中执行此操作的首选方法,因此如果 em.nextElement() 恰好为空,则此代码不会抛出讨厌的 NullPointerException(因为 .equals 方法检查空,如果参数为空,它返回 false)

    因此,您的代码最终会看起来像:

    while (em.hasMoreElements()) {
        String element = (String)em.nextElement();
        if (!"uname".equals(element))
            session.removeAttribute(element);
    }
    

    【讨论】:

      【解决方案2】:

      您确实收到了这条消息。检查枚举是否至少包含一个元素,然后获取并比较一个元素并删除另一个元素。最重要的是“==”比较引用,而不是值。至少你的循环体应该看起来像

      String temp=(String)em.nextElement();
      if (!temp.equals("uname")) {
          session.removeAttribute(temp);
      }
      

      【讨论】:

        【解决方案3】:

        它也有效

        Collections.list(session.getAttributeNames())
                        .stream()
                        .filter(s -> !s.equals("uname"))
                        .forEach(session::removeAttribute);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 2015-05-12
          • 2013-06-17
          • 2018-01-21
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          相关资源
          最近更新 更多