gpt4 book ai didi

java - 带有非系统范围 CookieHandler 的 HttpURLConnection

转载 作者:行者123 更新时间:2023-11-30 01:59:15 24 4
gpt4 key购买 nike

我有一个使用 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();

关于java - 带有非系统范围 CookieHandler 的 HttpURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53451280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com