如何有效删除Java中的多个会话密钥?

时间:2017-08-28 20:56:52

标签: java session

我正在尝试优化下面的代码段。我想通过使用单个循环清除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);

            }

        }

    }

任何改进我的代码的建议。我试过看here以及堆栈溢出问题和here的一些老问题,但仍然有困难。 TIA

2 个答案:

答案 0 :(得分:2)

您希望优化已经精心设计的内容 由于您不应在迭代过程中删除元素,因此需要将要删除的元素收集到List中,并在迭代后迭代此List以删除它们。
这种方法很好,逻辑流程也是“优化的”。

如果您必须真正更改实际代码中的内容,则可能是冗余操作:

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)具有相同的效果。

答案 1 :(得分:1)

 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