我想優化下面的代碼片段。我想通過使用單個循環清除java中的多個會話密鑰。所以要求我不想清除所有的會話密鑰,我想保留一些會話密鑰。例如,在下面的代碼片段中,我試圖刪除包含ID_NAME_
的密鑰,並保留傳遞給該方法的ID。如何高效地刪除Java中的多個會話密鑰?
下面的代碼片段,我寫的正常工作:
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);
}
}
下面是我試圖把它做成一個循環的代碼,但得到一個錯誤,因爲removeAttribute()
將刪除與綁定的對象來自此會話的指定名稱。在這種情況下,我認爲key
將被刪除,並且將無法檢查列表中的下一個元素。
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);
}
}
}
任何改善我的代碼的建議。我試過尋找here和一些堆棧溢出問題和here的老問題,但仍然有困難。 TIA
能 「ID_NAME_」 或 「ID_REPO_」 真的出現在字符串中的任何地方?如果他們只能在開始時出現,你應該使用'startsWith'而不是'contains',這兩者都是爲了表現(小),所以你不會在某一天(!)得到一個不好的驚喜。另外,你爲什麼要調用你的'keyArrs'列表?你是海盜嗎?我只是稱它爲「鑰匙」。 –
是@DavidConrad,「ID_NAME」出現在字符串的開頭。我可以使用startsWith。感謝您指出了這一點。另外,我不需要爲第二種解決方案使用'keyArrs'。我已經在第一個解決方案中使用'keys'進行枚舉。我意識到我應該使用更好的命名約定。 – Techiee