java - 具有非系统范围的 CookieHandler 的 HttpURLConnection
问题描述
我有一个使用HttpURLConnection
. 我需要它来处理 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
方法。
或者,您可以手动控制应用程序上不应共享的 cookie 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();
推荐阅读
- python - 在 Python 中创建条件数字特征列表
- python - 希望为每个用户 ID 创建纵向数据,但我不确定如何填充没有值的月份
- c# - 如何删除所有与模式不匹配的符号
- java - JVM 上的多个 -XX 命令行选项
- rest - 在 ZF3 中定义具有多个参数的 API 路由
- github - Github 页面不能包含在 Shiny 应用中?
- r - 从 data.frame/table 中的行创建环境变量
- python - 抓取所有页面 url 的 Python 脚本
- multithreading - 如何在 Qml/C++ 中实现繁忙指标?
- xpath - 无法使用路径提取器从响应中提取 xml 值