具有非系统范围的CookieHandler的HttpURLConnection

时间:2018-11-23 18:10:23

标签: java cookies httpurlconnection cookiemanager

我有一个Web应用程序,该应用程序使用HttpURLConnection发出HTTP请求。我需要它来处理cookie。我知道只需添加一行代码即可轻松完成,例如

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));

问题是通过这种方式,我按照文档中所述设置系统范围的Cookie处理程序。这也会影响在同一servlet容器中运行的其他Web应用程序。例如,如果我想在一个应用程序中使用CookiePolicy.ACCEPT_ORIGINAL_SERVER,而在另一个应用程序中使用CookiePolicy.ACCEPT_ALL,则它将不起作用。

有没有办法使CookieHandler仅由单个HttpURLConnection实例使用?

1 个答案:

答案 0 :(得分:1)

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