在不使会话失效的情况下销毁所有会话变量 java
Destroy all session variables without invalidating session java
我试图在不使会话无效的情况下删除所有会话属性,因为我需要一些像这样的会话变量:
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.nextElement(Collections.java:3665)
是否有更好的方法一次性删除所有会话变量而不会使会话失效。我现在不想打电话给 session.invalidate()
。
您确实收到了这条消息。您检查枚举是否至少有一个元素,然后获取并比较一个元素并删除另一个元素。最重要的是“==”比较引用,而不是值。至少你的循环体应该看起来像
String temp=(String)em.nextElement();
if (!temp.equals("uname")) {
session.removeAttribute(temp);
}
这段代码中发生了一些奇怪的事情。
- 首先,您在 while 循环中调用了两次
em.nextElement()
,第二次调用 em.nextElement()
并不能确保那里确实有另一个元素。
- 其次,在Java中进行字符串比较时,您不应该使用
==
或!=
,这些运算符检查引用相等性,您想要的是值相等性,因此您需要使用 .equals
方法。在你的例子中,!"uname".equals((String)em.nextElement())
。作为快速说明,请注意我们如何在此字符串相等性中首先使用字符串文字。这是在 Java 中执行此操作的首选方法,这样如果 em.nextElement()
恰好为 null,此代码将不会抛出讨厌的 NullPointerException
(因为 .equals 方法会检查 null ,如果参数为 null,则 returns false)
因此您的代码最终看起来像这样:
while (em.hasMoreElements()) {
String element = (String)em.nextElement();
if (!"uname".equals(element))
session.removeAttribute(element);
}
它也有效
Collections.list(session.getAttributeNames())
.stream()
.filter(s -> !s.equals("uname"))
.forEach(session::removeAttribute);
我试图在不使会话无效的情况下删除所有会话属性,因为我需要一些像这样的会话变量:
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.nextElement(Collections.java:3665)
是否有更好的方法一次性删除所有会话变量而不会使会话失效。我现在不想打电话给 session.invalidate()
。
您确实收到了这条消息。您检查枚举是否至少有一个元素,然后获取并比较一个元素并删除另一个元素。最重要的是“==”比较引用,而不是值。至少你的循环体应该看起来像
String temp=(String)em.nextElement();
if (!temp.equals("uname")) {
session.removeAttribute(temp);
}
这段代码中发生了一些奇怪的事情。
- 首先,您在 while 循环中调用了两次
em.nextElement()
,第二次调用em.nextElement()
并不能确保那里确实有另一个元素。 - 其次,在Java中进行字符串比较时,您不应该使用
==
或!=
,这些运算符检查引用相等性,您想要的是值相等性,因此您需要使用.equals
方法。在你的例子中,!"uname".equals((String)em.nextElement())
。作为快速说明,请注意我们如何在此字符串相等性中首先使用字符串文字。这是在 Java 中执行此操作的首选方法,这样如果em.nextElement()
恰好为 null,此代码将不会抛出讨厌的NullPointerException
(因为 .equals 方法会检查 null ,如果参数为 null,则 returns false)
因此您的代码最终看起来像这样:
while (em.hasMoreElements()) {
String element = (String)em.nextElement();
if (!"uname".equals(element))
session.removeAttribute(element);
}
它也有效
Collections.list(session.getAttributeNames())
.stream()
.filter(s -> !s.equals("uname"))
.forEach(session::removeAttribute);