: постоянные файлы cookie, используемые при доступе к HttpClient и HttpGet.

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

Просматривая Интернет, я увидел, что «PersistentCookiestore» является хорошей отправной точкой.

Вопрос 1: как я могу использовать (apache) PersistentCookieStore в программном обеспечении HttpClient? Я не вижу полных примеров, например. как начать использовать PersistentCookieStore при первом использовании httpclient.

См., например:

static PersistentCookieStore cookie_jar = new PersistentCookieStore( getApplicationContext()); 

public void login() { 
    // how to connect the persistent cookie store to the HttpClient? 
    ....
    client2 = new DefaultHttpClient( httpParameters);
    …
    client2.setCookieStore(cookie_jar);
    ....
    HttpGet method2 = new HttpGet(uri2);
    ....
    try {
     res = client2.execute(method2); 
}
catch ( ClientProtocolException e1) { e1.printStackTrace(); return false; }
    ....

Вопрос 2: Как мне обновить куки после звонка, или это никогда не нужно? Другими словами: когда мне нужно обновить файл cookie после вызова HttpGet или HttpPost после вызова client2.execute(...).

В примере кода (непостоянных) файлов cookie с httpclient я увидел:

cookie_jar = client.getCookieStore(); 
….
HttpGet or HttpPost … 
client.setCookieStore( ....) 
client.execute( .. )  // second call

Спасибо за помощь.


person tm1701    schedule 07.04.2014    source источник


Ответы (2)


Вопрос 1. Я использую AsyncHttpClient с PersistenCookieStore.

Вопрос 2. Я обновляю файлы cookie только тогда, когда пользователь входит в приложение.

AsyncHttpClient client = new AsyncHttpClient();
PersistentCookieStore myCookie = new PersistentCookieStore(CONTEXT);


//Clean cookies when LOGIN
if(IS_LOGIN)
    myCookie.clear();

client.setCookieStore(myCookie);

Прямо сейчас я хочу знать, как узнать, когда истек срок действия файла cookie.

person Jorge Casariego    schedule 03.11.2014
comment
Спасибо за ответ ... после многих проб я выбрал тот, что выше. - person tm1701; 22.12.2014

Первоначальный вопрос был: как предотвратить вход в систему каждый раз после запуска приложения? Ответ, конечно, использовать куки. Итак, как мне сохранить файлы cookie, чтобы я мог повторно использовать их после перезапуска приложения?

Ответ, который работает для меня, очень прост: просто преобразуйте хранилище файлов cookie в строку, поместите ее в общие настройки перед выходом из приложения. После следующего запуска приложения, поэтому перед следующим входом в систему, просто получите жало из общих настроек, преобразуйте его обратно в хранилище файлов cookie. Использование cookiestore не позволяет мне снова войти в систему.

public void saveCookieStore( CookieStore cookieStore) {
    StringBuilder cookies = new StringBuilder();
    for (final Cookie cookie : cookieStore.getCookies()) {
        cookies.append(cookie.getName());
        cookies.append('=');
        cookies.append(cookie.getValue());
        cookies.append('=');
        cookies.append(cookie.getDomain());
        cookies.append(';');
    }
    SharedPreferences.Editor edit = sharedPref.edit();
    edit.putString( MY_GC_COOKIESTORE, cookies.toString());
    edit.commit();
}

// retrieve the saved cookiestore from the shared pref
public CookieStore restoreCookieStore() {
    String savedCookieString = sharedPref.getString( MY_GC_COOKIESTORE, null);
    if( savedCookieString == null || savedCookieString.isEmpty()) { 
        return null; 
    }
    CookieStore cookieStore = new BasicCookieStore();
    for ( String cookie : StringUtils.split( savedCookieString, ';')) {
        String[] split = StringUtils.split( cookie, "=", 3);
        if( split.length == 3) {
            BasicClientCookie newCookie = new BasicClientCookie( split[0], split[1]);
            newCookie.setDomain( split[2]);
            cookieStore.addCookie( newCookie);
        }
    }
    return cookieStore;
}
person tm1701    schedule 22.12.2014