HttpURLCподключение с несистемным CookieHandler - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть веб-приложение, которое делает HTTP-запросы, используя HttpURLConnection.Мне нужно это для обработки куки.Я знаю, что это легко сделать, добавив всего одну строку кода, что-то вроде

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

Проблема заключается в том, что я устанавливаю общесистемный обработчик файлов cookie, как описано в документации.Это также влияет на другие веб-приложения, работающие в том же контейнере сервлета.Например, если я хочу CookiePolicy.ACCEPT_ORIGINAL_SERVER в одном приложении и CookiePolicy.ACCEPT_ALL в другом, оно не будет работать.

Есть ли способ получить CookieHandler, который используется только одним HttpURLConnectionэкземпляр

1 Ответ

0 голосов
/ 27 ноября 2018

В стандартной реализации 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();
...