:HttpClient和HttpGet访问中使用的持久性cookie

时间:2014-04-07 17:47:47

标签: android cookies androidhttpclient cookiestore

我希望用户通过HttpGet / HttpPost操作执行不同的任务。 我想保存Cookie,以便用户只需在cookie过期后登录。

在浏览互联网时,我看到了" PersistentCookiestore"是一个很好的起点。

问题1:如何在HttpClient软件中使用(apache)PersistentCookieStore?我没有看到完整的例子,例如如何在第一个httpclient使用中开始使用PersistentCookieStore。

参见例如:

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,或者这是否永远不需要? 换句话说:当我在调用client2.execute(...)之后调用HttpGet或HttpPost之后必须更新cookie时。

在使用httpclient的(非持久性)cookie的示例代码中,我看到了:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

问题1:我在PersistenCookieStore中使用AsyncHttpClient

问题2:我仅在用户登录应用时更新我的​​Cookie

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


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

client.setCookieStore(myCookie);

现在我想知道如何知道cookie何时过期

答案 1 :(得分:0)

最初的问题是:如何在应用启动后每次阻止登录?答案当然是使用cookies。那么如何存储cookie以便我可以在重启后重复使用?

对我有用的答案很简单:只需将cookiestore转换为字符串,在退出应用程序之前将其放入共享首选项中。 在下一个应用程序启动之后,所以在下次登录之前,只需从共享首选项中获取sting,将其转换回cookiestore。使用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;
}