首页 > 解决方案 > 具有非系统范围的 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实例使用?

标签: javacookieshttpurlconnectioncookiemanager

解决方案


在标准的 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();

推荐阅读