我正在使用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的类似问题,但它还没有被回答。谢谢你的帮助!
答案 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