删除特定 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 符合您的条件的情况。
我正在使用 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 符合您的条件的情况。