Jak obsługiwać pliki cookie w httpUrlConnection za pomocą cookieManager

Mam żądanie serwera, które zwraca wiele ciasteczek, Jak to:

Tutaj wpisz opis obrazka

W ten sposób zapisuję te pliki cookie do cookiemanagera:

HttpURLConnection connection = ... ;
static java.net.CookieManager msCookieManager = new java.net.CookieManager();
msCookieManager.put(COOKIES_URI, connection.getHeaderFields());

W ten sposób dodaję te ciasteczka do następnego połączenia:

connection.setRequestProperty("Cookie", 
  msCookieManager.getCookieStore().get(COOKIES_URI).toString());

Czy to dobry sposób, aby uzyskać ciasteczka z cookieManager?, Jestem pewien, że jest lepszy...

Author: Community, 2013-04-22

5 answers

Ok, właściwy sposób to zrobić jest właśnie tak:

Pobierz Pliki cookie z nagłówka odpowiedzi i załaduj je do cookieManager:

static final String COOKIES_HEADER = "Set-Cookie";
HttpURLConnection connection = ... ;
static java.net.CookieManager msCookieManager = new java.net.CookieManager();

Map<String, List<String>> headerFields = connection.getHeaderFields();
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);

if (cookiesHeader != null) {
    for (String cookie : cookiesHeader) {
        msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0));
    }               
}

Pobierz Pliki cookie z cookieManager i załaduj je do connection:

if (msCookieManager.getCookieStore().getCookies().size() > 0) {
    // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';'
    connection.setRequestProperty("Cookie",
    TextUtils.join(";",  msCookieManager.getCookieStore().getCookies()));    
}
 106
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 14:38:45

Szukałem / próbowałem od kilku dni, aby naprawić mój problem: nie można uzyskać dostępu do chronionych zasobów internetowych nawet po pomyślnym zalogowaniu

Stworzyłem tę samą aplikację na iOS i nie miałem tego samego problemu, ponieważ NSUrlConnection wykonało konserwację plików cookie za nami za sceną. Na Androidzie próbowałem ręcznie dodać cookie

connection.setRequestProperty("Cookie", "PHPSESSID=str_from_server")
Bez powodzenia.

W końcu przeczytałem to

I dodałem kolejne 2 linijki gdzieś na początku mojego app:

CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
I wszystko działa dobrze.
 50
Author: Golden Thumb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-11 16:33:05

@ David ' s answer is the best of the lot. Najłatwiej jest utrzymywać lokalny Menedżer plików CookieManager i ręcznie zapisywać i odczytywać ze sklepu plików cookie powiązanego z tym menedżerem plików cookie.

Ten kod ładuje pliki cookie z odpowiedzi do menedżera plików cookie:

/**
 * Gets Cookies from the response header and loads them into cookie manager
 *
 * @param conn          instance of {@link HttpURLConnection} object
 * @param cookieManager the cookie manager({@link CookieManager} instance) in which the cookies are to be loaded<p>In case a null object is passed, the function will not perform any action and return back to the caller. </p>
 */
public static void loadResponseCookies(@Nullable HttpURLConnection conn,@Nullable CookieManager cookieManager) {

    //do nothing in case a null cokkie manager object is passed
    if (cookieManager == null || conn == null){
        return;
    }

    List<String> cookiesHeader = conn.getHeaderFields().get(COOKIES_HEADER);
    if (cookiesHeader != null) {
        for (String cookieHeader : cookiesHeader) {
            List<HttpCookie> cookies;
            try {
                cookies = HttpCookie.parse(cookieHeader);
            } catch (NullPointerException e) {
                log.warn(MessageFormat.format("{0} -- Null header for the cookie : {1}",conn.getURL().toString(), cookieHeader.toString()));
                //ignore the Null cookie header and proceed to the next cookie header
                continue;
            }

            if (cookies != null) {
                Debug("{0} -- Reading Cookies from the response :", conn.getURL().toString());
                for (HttpCookie cookie : cookies) {
                    Debug(cookie.toString());
                }
                if (cookies.size() > 0) {
                    cookieManager.getCookieStore().add(null, HttpCookie.parse(cookieHeader).get(0));
                }
            }
        }
    }
}

Ten kod zapełnia obiekt HttpUrlConnection Plikami cookie powiązanymi z menedżerem plików cookie:

public void populateCookieHeaders(HttpURLConnection conn) {

    if (this.cookieManager != null) {
        //getting cookies(if any) and manually adding them to the request header
        List<HttpCookie> cookies = this.cookieManager.getCookieStore().getCookies();

        if (cookies != null) {
            if (cookies.size() > 0) {
                Debug("{0} -- Adding Cookie Headers : ", url.toString());
                for (HttpCookie cookie : cookies) {
                    Debug(cookie.toString(), null);
                }

                //adding the cookie header
                conn.setRequestProperty(COOKIE_REQUEST_HEADER, StringUtils.join(cookies, ";"));
            }
        }
    }
}
Jest to najbardziej bezpieczny sposób obsługi plików cookie.

Próbowałem użyć threadlocal cookiestore i rozszerzenie CookieManager. Żadne z tych podejść nie zadziałało w moim przypadku.

 3
Author: Aditya Satyavada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 11:53:09

Inne odpowiedzi są odpowiednie dla ich kontekstu, ale nikt nie mówi oczywistego: CookieHandler automatycznie zajmuje się Twoimi plikami cookie w większości przypadków. Aby utrzymać Pliki cookie od jednego żądania do następnego - na przykład w celu utrzymania sesji serwera - wystarczy ta linia kodu:

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

Upewnij się, że uruchomiłeś go raz przed pierwszym żądaniem z UrlConnection.

Teraz sam nie zarządzam Plikami cookie, a wszystkie moje dane sesji serwera są bezbłędnie utrzymywane od prośby do prośby.

Czy ja oszalałam? Dlaczego internet milczy na ten temat? Nie mogę go nawet znaleźć w dokumentach.
 1
Author: Malachi Holden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-02 01:40:39

Używając java.net.HttpURLConnection i groovy, wystarczy dodać URLConnection#addRequestProperty(String key, String value) wewnątrz with zamknięcie.

import java.net.HttpURLConnection

HttpURLConnection createRequest(String chatRequestBody) {
    HttpURLConnection httpChatRequest = new URL("${endpoint}").openConnection() as HttpURLConnection

    httpChatRequest.with {
        doOutput = true
        requestMethod = 'POST'

        //headers
        addRequestProperty("Content-Type", "application/json")
        addRequestProperty("Client-Platform", "android")

        //cookies
        addRequestProperty("Cookie", "cookie_key1=cookie_value1,cookie_key2=cookie_value2")

        getOutputStream().write(chatRequestBody.getBytes("UTF-8"))
    }
    httpChatRequest
}
 0
Author: prayagupd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 01:28:04