Double Set-Cookie: PHPSESSID в ответе http

Я пишу приложение, которое будет автоматически заполнять форму на веб-сайте (на Java)

Для этого пользователь должен войти в систему, и здесь возникает проблема: это часть ответа на запрос входа в систему:

Set-Cookie: PHPSESSID=3fvr31tb3c1iplpi3vqpvloar3; путь=/; домен=.bursatransport.com

Set-Cookie: PHPSESSID=eanaj1d9egd73uiome0jtsed43; путь=/; домен=.bursatransport.com

Насколько я проверял, последний вариант является правильным (я проверял его, изменив файл cookie PHPSESSID в браузере).

Мое приложение сохраняет первый файл cookie. В результате при отправке формы она ведет себя так, как будто пользователь не вошел в систему. Иногда он сохранял последний файл cookie, но не смог успешно отправить форму (так же, как и раньше).

Вот мой код входа:

String query = String
            .format("returnTo=/&Login[username]=%s&Login[password]=%s&Login[rememberMe]=0&yt4=",
                    URLEncoder.encode(name, charset),
                    URLEncoder.encode(password, charset));
    CookieManager manager = new CookieManager();
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
    CookieHandler.setDefault(manager);
    URLConnection mycon = new URL(url).openConnection();
    mycon.setDoOutput(true);
    mycon.setRequestProperty("Accept-Language", "ro-RO,ro;q=0.8,en-US;q=0.6,en;q=0.4");
    mycon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    mycon.setRequestProperty("Accept-Charset", charset);
    mycon.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded;charset=" + charset);
    OutputStream output = null;
    output = mycon.getOutputStream();
    output.write(query.getBytes(charset));
    mycon.getContent();

Это точно не проблема сервера, поскольку он правильно отвечает на запросы браузера (я слушаю их с помощью скрипача)


person ianos    schedule 20.08.2013    source источник


Ответы (1)


Я решил проблему (даже если я до сих пор не знаю ее корней).

Ответ содержал 2 заголовка «Set-Cookie», потому что (это не самая постоянная причина), мой запрос не содержал cookie PHPSESSID; Поэтому я изменил код, чтобы он сначала получил страницу входа (без данных для входа). Ответ на этот запрос устанавливает файл cookie PHPSESSID (но я не вошел в систему)

Затем я отправляю свой запрос на вход (который теперь содержит файл cookie PHPSESSID), и, бум, он работает.

вот код:

    CookieManager manager = new CookieManager();
    CookieHandler.setDefault(manager);
    URLConnection mycon = new URL(url).openConnection();
    mycon.getContent();
    String query = String
            .format("Login[username]=%s&Login[password]=%s&Login[rememberMe]=0&yt4=",
                    URLEncoder.encode(name, charset),
                    URLEncoder.encode(password, charset));
    mycon = new URL(url).openConnection();
    mycon.setDoOutput(true);
    mycon.setRequestProperty("Accept-Language", "ro-RO,ro;q=0.8,en-US;q=0.6,en;q=0.4");
    mycon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    mycon.setRequestProperty("Accept-Charset", charset);
    mycon.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded;charset=" + charset);
    OutputStream output = null;
    output = mycon.getOutputStream();
    output.write(query.getBytes(charset));
    output.close();
    mycon.getContent();
    mycon.getInputStream().close();

Этот пост «открыл мне глаза»: Java: обработка файлов cookie при регистрации через POST

person ianos    schedule 20.08.2013