Ich versuche, das untenstehende Code-Snippet zu optimieren. Ich möchte mehrere Session-Schlüssel in Java löschen, indem Sie eine einzelne Schleife verwenden. Also die Anforderung ist, dass ich nicht alle Sitzungsschlüssel löschen möchte, ich möchte einige der Sitzungsschlüssel behalten. Im unten stehenden Codefragment versuche ich beispielsweise, Schlüssel zu entfernen, die ID_NAME_
enthalten, und halte den Schlüssel mit der ID, die an die Methode übergeben wurde.Wie effizient löschen mehrere Sitzungsschlüssel in Java?
Unten ist der Code-Schnipsel I, die gut funktioniert hat geschrieben:
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
ArrayList<String> keyArrs = new ArrayList<>();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_"+id)) {
continue;
} else if(key.contains("ID_NAME_")) {
keyArrs.add(key);
}
}
for(String k : keyArrs){
System.out.println(k);
session.setAttribute(k, null);
session.removeAttribute(k);
}
}
Unten ist der Code, den ich versuchte, es in eine einzige Schleife zu machen, aber einen Fehler bekommen, weil removeAttribute()
die mit dem gebundenen Objekt entfernen Name aus dieser Sitzung angegeben. In diesem Fall denke ich, dass key
entfernt wird und nicht in der Lage sein wird, nach dem nextElement in der Liste zu suchen.
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
//ArrayList<String> keyArrs = new ArrayList<>();
String key;
while (keys.hasMoreElements()) {
key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_" + id)) {
continue;
} else if (key.contains("ID_NAME_")) {
session.removeAttribute(key);
}
}
}
Irgendwelche Vorschläge, um meinen Code zu verbessern. Ich habe versucht, here und einige alte Fragen von Stack-Überlauf Fragen und here suchen, aber immer noch Schwierigkeiten haben. TIA
Kann "ID_NAME_" oder "ID_REPO_" wirklich überall in der Zeichenfolge erscheinen? Wenn sie nur am Anfang erscheinen können, solltest du 'startsWith' anstelle von' contains' verwenden, sowohl für die Performance (Moll) als auch damit du keine schlechte Überraschung bekommst (!). Warum nennst du deine Liste 'keyArrs'? Bist du ein Pirat? Ich würde es nur 'Schlüssel' nennen. –
Ja @DavidConrad, "ID_NAME" erscheint am Anfang der Zeichenfolge. Ich kann startsWith verwenden. Danke, dass du darauf hingewiesen hast. Außerdem muss ich 'keyArrs' für die zweite Lösung nicht verwenden. Ich verwende bereits "Schlüssel" für die Aufzählung in der ersten Lösung. Ich weiß, dass ich eine bessere Namenskonvention hätte verwenden sollen. – Techiee