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

时间:2015-03-07 04:11:03

标签: java cookies httpcookie

我正在使用java.net.CookieManager& java.net.CookieHandler跟踪cookie。我需要删除一个但保留所有其他人。问题是使用cookieManger.getCookieStore()。getCookies()的List返回是不可修改的,因此当我尝试删除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);
}

有没有办法绕过这个或更好的方法来做到这一点?
我发现了一个关于不可修改的集合here的类似问题,但它还没有被回答。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

这是应该做的技巧:

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符合您的条件。

答案 1 :(得分:0)

你可能想在cookie商店中使用一种删除方法,而不是尝试直接使用列表。见:

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