【问题标题】:Remove specific java.net.CookieManager Cookie getting UnmodifiableCollection exception删除特定的 java.net.CookieManager Cookie 获取 UnmodifiableCollection 异常
【发布时间】:2015-03-07 04:11:03
【问题描述】:

我正在使用 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 的类似问题,但尚未得到解答。感谢您的帮助!

【问题讨论】:

  • Erm ...你读过CookieStore的javadoc吗?您是否阅读过它指定getCookies 返回的集合是不可修改的?您是否了解名称以字母“r”开头的方法?
  • “我在这里发现了一个关于不可修改集合的类似问题,但尚未得到解答。” - 坦率地说,我并不感到惊讶。答案是“不要那样做!”。
  • 我在提出问题后读了一会儿,也许我应该删除它,但我想其他人可能一开始也错过了这一点,并从这个问题中受益。

标签: java cookies httpcookie


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      相关资源
      最近更新 更多