Принять все куки через HttpClient

2

Итак, в настоящее время настроено мое приложение:

1.) Вход в систему. 2.) После входа в систему могут быть запущены другие действия, в которых используются скрипты PHP, для которых требуются файлы cookie, отправленные при входе в систему.

Я использую один HttpClient в своем приложении, чтобы убедиться, что используются одни и те же файлы cookie, но моя проблема заключается в том, что я получаю 2 из 3 cookie файлов. Я не забочусь о действительности файлов cookie, но мне нужно, чтобы они были приняты. Я попытался настроить CookiePolicy, но это тоже не сработало. Это то, что говорит logcat:

11-26 10:33:57.613: WARN/ResponseProcessCookies(271): Cookie rejected: "[version: 0]      [name: cookie_user_id][value: 1][domain: www.trackallthethings.com][path: trackallthethings][expiry: Sun Nov 25 11:33:00 CST 2012]". Illegal path attribute "trackallthethings". Path of origin: "/mobile-api/login.php"

11-26 10:33:57.593: WARN/ResponseProcessCookies(271): Cookie rejected: "[version: 0][name: cookie_session_id][value: 1985208971][domain: www.trackallthethings.com][path: trackallthethings][expiry: Sun Nov 25 11:33:00 CST 2012]". Illegal path attribute "trackallthethings". Path of origin: "/mobile-api/login.php"

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

HttpGet httpget = new HttpGet(//MY URL);
HttpResponse response;
response = Main.httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();

Отсюда я использую StringBuilder, чтобы просто получить строку ответа. Ничего необычного.

Я понимаю, что причина, по которой отклоняются мои файлы cookie, связана с "атрибутом незаконного пути" (я запускаю script в /mobile -api/login.php, тогда как файл cookie будет возвращаться с помощью пути только "/" для trackallthethings), но я хотел бы принять cookies в любом случае. Есть ли способ сделать это?

Теги:
httpclient
cookies

2 ответа

7
Лучший ответ

Проблема, с которой вы сталкиваетесь, по-видимому, разработана для обеспечения конфиденциальности/безопасности. В общем, любому ресурсу не разрешено устанавливать cookie, который он не сможет получить. Здесь вы пытаетесь установить cookie с помощью пути trackallthethings из ресурса /mobile-api/login.php, который, очевидно, не работает.

Здесь у вас есть следующие две опции:

  • Установите файл cookie с пути, доступным для обоих ресурсов (это может быть root '/') ИЛИ
  • Определите пользовательскую политику cookie и зарегистрируйте свою собственную поддержку файлов cookie. Вот связанная документация и пример.

Надеюсь, что это поможет.

  • 0
    Это определенно правильный ответ. Я думал, что делаю что-то не так, но оказалось, что мой партнер по проекту раздавал куки с неверным путем. :-)
2

Поскольку API HttpClient, похоже, очень быстро меняется, вот пример кода рабочего кода для HttpClient 4.5.1, чтобы разрешить все (некорректные) файлы cookie:

class EasyCookieSpec extends DefaultCookieSpec {
    @Override
    public void validate(Cookie arg0, CookieOrigin arg1) throws MalformedCookieException {
        //allow all cookies 
    }
}

class EasySpecProvider implements CookieSpecProvider {
    @Override
    public CookieSpec create(HttpContext context) {
        return new EasyCookieSpec();
    }
}

Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
            .register("easy", new EasySpecProvider())
            .build();

CookieStore cookieStore = new BasicCookieStore();

RequestConfig requestConfig = RequestConfig.custom()
            .setCookieSpec("easy")
            .build();

CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCookieStore(cookieStore)
            .setDefaultCookieSpecRegistry(r)
            .setDefaultRequestConfig(requestConfig)
            .build();
  • 0
    Я столкнулся с проблемой с этим кодом. Кажется, он не разрешает все искаженные куки. Например, я вижу Invalid 'expires' attribute исключение Invalid 'expires' attribute для некоторых токенов авторизации, которые я предоставляю при использовании простого класса Java Date. Sat, 16-Sep-2017 20:06:21 GMT > работает Fri, 24 Mar 2017 20:46:08 GMT > не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню