带有非系统范围 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();