2013-07-16 5 views
1

Я использую Spring для Android в проекте, и мне нужно управлять хранилищем/менеджером файлов cookie. Я могу добавлять файлы cookie к любому запросу, используя реализацию ClientHttpRequestInterceptor, но я бы хотел удалить некоторые из них при отправке запроса.android-spring resttemplate управлять кукисами

Чтобы быть более конкретным, проблема я столкнулся в том, что, для Froyo, конкретная реализация в SpringDefaultHttpClient) автоматически добавляет к заголовкам печенье из CookieStore - что даже если я устанавливаю явно заголовки. Но я хотел бы сам управлять этими куки (либо удалить некоторые из них, либо обновить их значения). Хотя для Gingerbread выше (Spring реализация выполняется с HttpURLConnection), файлы cookie добавляются только в том случае, если я делаю это сам - однако я не уверен, что я не вижу Spring, устанавливающего какой-либо CookieHandler, но в итоге я не знаю, t видеть их при выполнении запроса или я могу видеть их обновленными. Таким образом, проблема более специфична для Froyo.

Обход - это перезагрузка фабрики соединений; что-то вроде:

protected void resetCookieStoreForTemplate(RestTemplate template) { 
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) { 
     template.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 
    } 
} 

Underneath, который, кажется, чтобы воссоздать DefaultHttpClient и будет использовать новый CookieStore. Но это кажется мне немного уродливым.

Чтобы обернуть, мой вопрос будет: Spring for Android предоставить некоторый метод для предоставления некоторого API для управления Cookie? Только способ RestTemplate предоставляет некоторые абстракции для подключения, фабрики подключений, преобразователей сообщений и т. Д., Я был бы очень рад иметь абстракцию для управления файлами cookie.

+0

Bounty's gone: (... опубликует этот вопрос в сообществе 'Spring' и свяжет это с этим вопросом.Спасибо всем в любом случае – gunar

ответ

2

Я сам не использовал Spring, но из того, что я читал об этом, он следует официальным советам и переключает HTTP-клиенты на основе версии API (что довольно умно, если серьезно перепроектировано по моему вкусу). При использовании HTTPUrlConnection, как вы упомянули, Spring, вероятно, не меняет CookieHandler. Вы должны видеть обработку файлов cookie в памяти, поэтому все должно работать на запросы в одном и том же приложении, но файлы cookie будут удалены при закрытии приложения. Можете ли вы подтвердить, что это то, что вы видите?

Если да, то все, что вам нужно сделать, это создать новый экземпляр CookieManager, передавая ему обычай CookieStore и null для CookiePolicy использовать по умолчанию.

Очень жаль, что постоянный магазин не встроен, но написать его не так уж сложно.

Редактировать: См. here для магазина Cookie Store, который использует SharedPreferences (не проверял его сам).

+0

Как уже упоминалось, проблема, с которой я сталкиваюсь, специфична для Froyo (http-движок реализован с Apache 'DefaultHttpClient'), так как я не вижу никакого доступа к' CookieStore'. Элегантное решение в Gingerbread выше (установить постоянный «CookieStore» через «CookieHandler») отлично работает, но у меня нет такого доступа к его реализации Apache 'CookieStore'. Я надеялся, что некоторые API отбросят доступ к «CookieStore» ... Честно говоря, я считаю, что этот вопрос должен быть размещен в сообществе Spring, поскольку мне кажется, что это запрос функции. – gunar

+0

К сожалению, из вашего описания это звучит как Пряник и выше - проблема. В таком случае, да, это похоже на запрос функции, а весеннее сообщество - лучшее место для вас. – Delyan

+0

'от вашего описания это звучит как Пряник и выше проблемы' ... хмммм. Я немного изменил вопрос, добавив следующее: «Но я хотел бы сам управлять этими куки (либо удалить некоторые из них, либо обновить их значения). Надежда более ясна. Спасибо, что отметили это наблюдение! – gunar

1

Класс ClientHttpRequestInterceptor - хороший подход, когда вам необходимо передать общие заголовки для всех запросов, таких как настройка типа содержимого, авторизация и т. Д. Насколько я понял, вы хотите передать некоторые значения cookie для конкретного запроса. Вы также можете достичь этого через классы HttpEntity и HttpHeaders.

HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.add("Cookie", "name=" + value); 
    HttpEntity requestEntity = new HttpEntity(null, requestHeaders); 
    ResponseEntity response = restTemplate.exchange(
     "http://server/service?...", 
     HttpMethod.GET, 
     requestEntity, 
     Response.class); 

Весенний шаблон для отдыха не предусматривает самостоятельного решения для управления куки-файлами. Класс CookieHandler предоставляется Apache не частью пружины. Шаблон останова - это просто базовое решение для управления ответом на запрос с использованием весеннего ядра.

+0

Спасибо, что ответили, но я боюсь, что это не помогает, поскольку мой вопрос: 'does Spring для Android предоставляет какой-то метод для предоставления некоторого API для управления Cookie?' Я уже передаю пользовательскую 'Cookie', как вы упомянули (упомянутый в 2-я фраза), но мне нужно управлять всем хранилищем файлов cookie. Я могу сделать это на уровне API 9 выше, установив постоянный «CookieStore» в 'CookieHandler.setDefault (...)', но для Froyo я не вижу, чтобы такое центральное репозитование cookie имело возможность автоматически связываться с 'DefaultHttpClient'. – gunar

+0

Я обновил свой ответ. –

+0

«Насколько я понял, вы хотите передать некоторые значения cookie для конкретного запроса». Я хочу удалить или отредактировать эти файлы cookie. Это работает для Gingerbread выше, но это не работает для Froyo, потому что мне кажется, что 'DefaultHttpClient' использует то, что он имеет в' CookieStore', игнорируя совпадающие заголовки, переданные через ClientHttpRequestInterceptor'. Off-topic: 'CookieHandler', похоже, не предоставляется Apache, поскольку его имя пакета' java.net'. Поэтому моя проблема заключается в том, что я не вижу никакого API для доступа к хранилищу cookie. Я надеялся увидеть некоторые абстракции. – gunar

Смежные вопросы