簡體   English   中英

如何有效地刪除Java中的多個會話密鑰?

[英]How to efficiently delete Multiple Session Keys in Java?

我正在嘗試優化下面的代碼片段。 我想使用一個循環來清除Java中的多個會話鍵。 因此,要求是我不想清除所有會話密鑰,而我想保留一些會話密鑰。 例如,在下面的代碼片段中,我試圖刪除包含ID_NAME_鍵,並保留將ID傳遞給該方法的鍵。

下面是我寫的代碼片段,可以正常工作:

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將被刪除,並且將無法檢查列表中的nextElement。

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);

            }

        }

    }

任何改善我的代碼的建議。 我試圖在這里以及一些舊的堆棧溢出問題和此處嘗試問題,但是仍然遇到困難。 TIA

您想優化已經設計好的東西。
由於您不應該在元素迭代期間刪除元素,因此可以收集要刪除的元素到列表中,並在迭代后迭代此列表以刪除它們。
這種方法很好,並且邏輯流程已“優化”。

如果您必須真正更改實際代碼中的某些內容,則可能是多余的操作:

session.setAttribute(k, null);
session.removeAttribute(k);

您應該只選擇其中之一:

for(String k : keyArrs){
    System.out.println(k);
    session.removeAttribute(k);
}

由於session.setAttribute(k, null)具有與調用session.removeAttribute(k)相同的效果。

 if (key.contains("ID_REPO_" + id)) {
                continue;
            } else if (key.contains("ID_REPO_")) {

                session.removeAttribute(key);

            }

將此重構為java流:

key.stream()
.filter(key -> !key.contains("ID_REPO_" + id)) //filter all keys that do not have string
.forEach(key -> session.removeAttribute(key)) // execute lambda on every key filtered

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM