Czy HttpURLConnection z CookieManager powinien automatycznie obsługiwać pliki cookie sesji?

Mam aplikację Java (JDK 1.7.0_13) i używam java. net. HttpURLConnection do łączenia się z niektórymi usługami bazującymi na serwletach, które zarządzają sesjami. Próbuję dowiedzieć się, jak używać java.net.CookieManager do śledzenia plików cookie sesji. Czytając dokumenty mam wrażenie, że instalowanie Cookiemanagera z CookieHandler.setDefault (nowy CookieManager ()) powinien spowodować automatyczne zarządzanie plikami cookie. Jednak wiele żądań do tego samego adresu URL nie wydaje się zachować ciasteczka. Czy muszę ręcznie wyodrębniać pliki cookie z odpowiedzi i ponownie wysyłać je we wnioskach na własną rękę, czy CookieManager zrobi to za mnie automatycznie? Jeśli CookieManager tego nie robi, to jaką wartość dodaje?

Aby przetestować rzeczy, mam servlet, który z powodzeniem zwiększa licznik za każdym razem, gdy moja przeglądarka odwiedza adres URL. To działa dobrze z Safari, FireFox i Chrome... Jednak nie mogę go uruchomić z samodzielnej aplikacji Java.

Oto bardzo prosty test program do zilustrowania tego, co miałem nadzieję, że będzie proste działanie. Instaluje CookieManager na początku, a następnie wywołuje metodę fetch(String urlString) wielokrotnie, gdy adresy URL są wpisywane w konsoli.

package com.brilliant.experimental;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpFetcher {  
    public static void fetch(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            InputStream in = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            int status = conn.getResponseCode();
            System.out.println("Status = " + status);
            String key;
            System.out.println("Headers-------start-----");
            for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
                System.out.println(key + ":" + conn.getHeaderField(i));
            }
            System.out.println("Headers-------end-----");
            System.out.println("Content-------start-----");
            String inputLine;
            while ((inputLine = reader.readLine()) != null) {
                System.out.println(inputLine);
            }
            System.out.println("Content-------end-----");
            in.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
        CookieHandler.setDefault(new CookieManager());

        for (int i = 0; i < args.length; i++) {
            fetch(args[i]);
        }

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(isr);
        String prompt = "> ";
        String urlString;
        try {
            for (System.out.print(prompt);
                    (urlString = reader.readLine()) != null; 
                    System.out.print(prompt)) 
            {
                fetch(urlString);
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        }
    }

}

Wywołanie mojego servleta z tej aplikacji wyraźnie pobiera plik cookie sesji z serwera. Jednak wywołanie ponownie otrzymuje nowy plik cookie sesji.

> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:31 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:33 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----

Tak więc, podsumowując, Czy muszę zrobić coś innego, aby CookieManager działał automatycznie dla mnie, Czy muszę uciekać się do ręczne wyodrębnianie plików cookie z odpowiedzi i ponowne wysyłanie ich z żądaniami?

Author: Chuck, 2013-02-13

1 answers

Uruchamiam Twój kod i zamieniam ten

CookieHandler.setDefault(new CookieManager()); 

By

CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );
To działa!
 56
Author: pramoth,
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
2013-03-21 11:37:05