HttpGet обрабатывает куки автоматически? - PullRequest
9 голосов
/ 15 сентября 2011

Я хотел бы сохранить сеанс при подключении к серверу с помощью HttpGet, и мне нужно понять, как он обрабатывает файлы cookie.

Разработчик сервера говорит, что он сам обрабатывает все файлы cookie.Я использую запрос HttpGet для доступа к серверу следующим образом: InputStream isResponse = null;

    HttpGet httpget = new HttpGet(strUrl);
    HttpResponse response = mClient.execute(httpget);

    HttpEntity entity = response.getEntity();
    isResponse = entity.getContent();
    responseBody = convertStreamToString(isResponse);

    return responseBody;
  1. Должен ли я сделать что-то еще?Размещает ли он файл cookie на моем устройстве автоматически, и метод HttpGet знает, как его использовать, чтобы сохранить идентификатор сессии с помощью файла cookie?

  2. Как я могу проверить, существует ли файл cookie на моем устройстве, чтобы узнать, является ли сеанс "живым"?

  3. В случае, если я использую следующий код для получения куки:

    CookieStore cookieStore = new BasicCookieStore();
    
    // Create local HTTP context
    HttpContext localContext = new BasicHttpContext();
    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    
    HttpGet httpget = new HttpGet(strUrl);
    HttpResponse response = mClient.execute(httpget,localContext);
    

HttpGet по-прежнему обрабатывает cookie-файлы так же, как и раньше?

  1. Я вижу, что DefaultHttpClient (mClient в приведенном выше коде) имеет свой собственный CookieStore.Как я могу сохранить их куки и загрузить их при следующем создании?

Ответы [ 3 ]

6 голосов
/ 15 сентября 2011

Итак ... Потратив несколько часов на размышления и реализовав свой собственный примитивный CookieStore, я обнаружил Асинхронный клиент Http для Android , который включает замечательный PersistentCookieStore, который отлично работает!Просто добавил банку в мой проект и использовал его следующим образом:

PersistentCookieStore cookieStore = new PersistentCookieStore(context);
DefaultHttpClient mClient = new DefaultHttpClient();    
mClient.setCookieStore(cookieStore);

и все!Файлы cookie сохраняются и используются повторно при повторном открытии приложения.

Спасибо, Джеймс Смит, где бы вы ни находились.Вы сделали счастливым хотя бы одного человека.

Если кто-то заинтересован в моей собственной примитивной реализации (которая также работает), вот она:

package com.pinhassi.android.utilslib;

import java.util.Date;
import java.util.List;

import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class MyPersistentCookieStore extends BasicCookieStore {
private static final String COOKIES_LIST = "CookiesList";
private static final String COOKIES_NAMES = "CookiesNames";

private Context mContext;
/**
 * 
 */
public MyPersistentCookieStore(Context context) {
    super();
    mContext = context;
    load();
}

@Override
public synchronized void clear(){
    super.clear();
    save();
}

@Override
public synchronized boolean clearExpired(Date date){
    boolean res = super.clearExpired(date);
    save();
    return res;
}

@Override
public synchronized void addCookie(Cookie cookie){
    super.addCookie(cookie);
    save();
}

@Override
public synchronized void addCookies(Cookie[] cookie){
    super.addCookies(cookie);
    save();
}

public synchronized void save()
{
    Editor editor = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE).edit();
    editor.clear();
    List <Cookie> cookies = this.getCookies();
    StringBuilder sb = new StringBuilder();
    for (Cookie cookie : cookies)
    {
        editor.putString(cookie.getName(),cookie.getValue());
        sb.append(cookie.getName()+";");
    }
    editor.putString(COOKIES_NAMES,sb.toString());
    editor.commit();
}

public synchronized void load()
{
    SharedPreferences prefs = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE);
    String [] cookies = prefs.getString(COOKIES_NAMES,"").split(";");
    for (String cookieName : cookies){
        String cookieValue = prefs.getString(cookieName, null);
        if (cookieValue!=null)
            super.addCookie(new BasicClientCookie(cookieName,cookieValue));
    }

    }

}
1 голос
/ 15 сентября 2011

Нет, куки не обрабатываются автоматически. Для сохранения куки автоматически используйте BasicCookeStore

Больше информации об использовании здесь: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html

Также смотрите этот ответ: Постоянные куки-файлы Android HttpClient

0 голосов
/ 15 сентября 2011

Мне не нужно было заботиться о печенье. Когда я создаю свой DefaultHttpClient и выполняю httpclient.execute(httpget); как здесь , объект сохраняет в нем сеанс. Итак, сначала я делаю вход в систему, а затем я могу использовать частные функции моего API. Если я хочу выйти из системы, я создаю новый экземпляр моего объекта DefaultHttpClient или вызываю функцию выхода из системы.

Так что, если вы хотите использовать информацию о куки, используйте CookieStore, если не просто используете одноэлементный экземпляр, чтобы сохранить объект DefaultHttpClient

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...