删除特定 java.net.CookieManager Cookie 获取 UnmodifiableCollection 异常

Remove specific java.net.CookieManager Cookie getting UnmodifiableCollection exception

我正在使用 java.net.CookieManager 和 java.net.CookieHandler 来跟踪 cookie。我需要删除一个但保留所有其他的。问题是来自 using cookieManger.getCookieStore().getCookies() 的列表 return 是不可修改的,因此当我尝试删除 cookie 时抛出异常。
这是关于 cookie 的代码:

public HttpProxy(String host, String port) {
    cookieManager = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
    CookieHandler.setDefault(cookieManager);
    //other irrelevant code
}

private CookieManager cookieManager;

public void deleteGameCookie() {
    CookieStore cookieStore = cookieManager.getCookieStore();
    List<HttpCookie> cookieList = cookieStore.getCookies();

    HttpCookie temp = null;
    // iterate HttpCookie object
    for (HttpCookie cookie : cookieList) {
        try {
            String name = URLDecoder.decode(cookie.getName().replace("+", "%2B"), "UTF-8").replace("%2B", "+");
            if(name.equals("catan.game")) {
                System.out.println("catan.game cookie found");
                temp = cookie;
            }
        } catch (UnsupportedEncodingException e) {
            //System.out.println("Error decoding cookie... bummer...");
            e.printStackTrace();
        }
    }
    cookieList.remove(temp);
}

是否有解决此问题的方法或更好的方法?
我发现了一个关于 unmodifiable collections here 的类似问题,但尚未得到解答。感谢您的帮助!

您可能想对 cookie 存储使用其中一种删除方法,而不是尝试直接使用列表。见:

http://docs.oracle.com/javase/7/docs/api/java/net/CookieStore.html

这是一个应该可以解决问题的代码:

public void deleteGameCookie() {
  CookieStore cookieStore = cookieManager.getCookieStore();

  List<HttpCookie> cookiesToRemove = new ArrayList<>();

  for (HttpCookie cookie : cookieStore.getCookies()) {
    try {
      String name = URLDecoder.decode(cookie.getName().replace("+", "%2B"), "UTF-8").replace("%2B", "+");
      if (name.equals("catan.game")) {
        cookiesToRemove.add(cookie);
      }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
  }
  for (HttpCookie cookie : cookiesToRemove) {
    cookieStore.remove(null, cookie);
  }
}

该代码还应处理未找到 cookie 以及有多个 cookie 符合您的条件的情况。