我有一个Web应用程序,该应用程序使用HttpURLConnection
发出HTTP请求。我需要它来处理cookie。我知道只需添加一行代码即可轻松完成,例如
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
问题是通过这种方式,我按照文档中所述设置系统范围的Cookie处理程序。这也会影响在同一servlet容器中运行的其他Web应用程序。例如,如果我想在一个应用程序中使用CookiePolicy.ACCEPT_ORIGINAL_SERVER
,而在另一个应用程序中使用CookiePolicy.ACCEPT_ALL
,则它将不起作用。
有没有办法使CookieHandler
仅由单个HttpURLConnection
实例使用?
答案 0 :(得分:1)
在标准的oracle实现中,HttpURLConnection
在构造函数上获得默认的CookieHandler
,因此这是一种可能的解决方案。创建一个同步的单例工厂,该工厂使用每个应用程序的特定管理器来创建HttpURLConnections
。我认为这不是个好主意。
另一个不好的主意是提供自己的CookiePolicy
并使用shouldAccept
方法来解决问题。
或者您可以在应用程序上手动控制不应共享CookieHandler
的Cookie:
HttpURLConnection firstCall = (HttpURLConnection) new URL("http://www.google.com").openConnection();
firstCall.connect();
List<HttpCookie> cookieList = HttpCookie.parse(firstCall.getHeaderField("Set-Cookie"));
firstCall.disconnect();
StringBuilder cookies = new StringBuilder();
for(HttpCookie cookie:cookieList) {
//if(cookie.SOME_VALIDATION) {
if(cookies.length() > 0) {
cookies.append("; ");
}
cookies.append(cookie.toString());
//}
}
HttpURLConnection secondCall = (HttpURLConnection) new URL("http://www.google.com").openConnection();
secondCall.setRequestProperty("Cookie", cookies.toString());
secondCall.connect();
//dosomething
secondCall.disconnect();