2017-07-24 13 views
0

Je cherche à supprimer tous les ma session attributs sans annuler la session car je besoin de quelques variables de session comme celle-ci:Détruire toutes les variables de session sans annuler la 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()); 
     } 
    } 

mais je reçois une erreur:

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) 

Existe-t-il un meilleur moyen de supprimer toutes les variables de session à la fois sans invalider la session. Je ne veux pas appeler session.invalidate() à ce stade.

Répondre

1

Il y a quelques choses bizarres dans ce code.

  • Tout d'abord, vous appelez em.nextElement() deux fois dans la boucle while, et que le deuxième appel à em.nextElement() ne garantit pas qu'il y ait effectivement un autre élément là. Deuxièmement, lorsque vous faites des comparaisons de chaînes en Java, vous ne devriez pas utiliser == ou !=, ces opérateurs vérifient l'égalité de référence, ce que vous voulez, c'est l'égalité des valeurs, donc vous devez utiliser la méthode .equals. Dans votre cas, !"uname".equals((String)em.nextElement()). Et comme une note rapide, notez comment nous avons utilisé la chaîne littérale en premier dans cette égalité de chaîne. C'est la manière préférée de le faire en Java de sorte que si le em.nextElement() se trouve être nul, ce code ne lancera pas un méchant NullPointerException (parce que la méthode .equals vérifie null, et si l'argument est nul, il renvoie false)

Ainsi votre code serait finir par quelque chose comme:

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

Merci, très bonne explication. – ErrorNotFoundException

1

En effet, vous avez ce message. Vous vérifiez si l'énumération comporte au moins un élément, puis vous récupérez et comparez un élément et en supprimez un autre. En plus de cela, "==" compare les références, pas les valeurs. Au moins, le corps de votre boucle doit ressembler à

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

Il fonctionne aussi

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