带有非系统范围 CookieHandler 的 HttpURLConnection
HttpURLConnection with a non system-wide CookieHandler
我有一个使用 HttpURLConnection
发出 HTTP 请求的 Web 应用程序。我需要它来处理 cookie。我知道只需添加一行代码即可轻松完成,例如
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
问题是我按照文档中的描述设置了系统范围的 cookie 处理程序。这也会影响同一 servlet 容器中 运行 的其他 Web 应用程序。例如,如果我想在一个应用程序中使用 CookiePolicy.ACCEPT_ORIGINAL_SERVER
而在另一个应用程序中使用 CookiePolicy.ACCEPT_ALL
,它就不会工作。
有没有办法让 CookieHandler
仅供单个 HttpURLConnection
实例使用?
在标准的 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();
我有一个使用 HttpURLConnection
发出 HTTP 请求的 Web 应用程序。我需要它来处理 cookie。我知道只需添加一行代码即可轻松完成,例如
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
问题是我按照文档中的描述设置了系统范围的 cookie 处理程序。这也会影响同一 servlet 容器中 运行 的其他 Web 应用程序。例如,如果我想在一个应用程序中使用 CookiePolicy.ACCEPT_ORIGINAL_SERVER
而在另一个应用程序中使用 CookiePolicy.ACCEPT_ALL
,它就不会工作。
有没有办法让 CookieHandler
仅供单个 HttpURLConnection
实例使用?
在标准的 oracle 实现中,HttpURLConnection
在构造函数上获得默认值 CookieHandler
,因此这是一种可能的解决方案。创建一个同步的单例工厂,为每个应用程序使用特定的管理器创建 HttpURLConnections
。我认为这不是个好主意。
另一个坏主意是提供你自己的 CookiePolicy
并在 shouldAccept
方法上做这个技巧。
或者您可以在不应共享 CookieHandler
:
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();