SMGhost
SMGhost

Reputation: 4037

Creating BasicClientCookie

I need to store cookies to be able to keep session after closing application. To do that, I need to be able, to save cookie, and then recreate it. My current issue, is that I can't create BasicClientCookie right. Either domain is null, or other data is null.

Test Code:

List<Cookie> cookies = this.httpClient.getCookieStore().getCookies();
if (cookies != null) {
    Log.print("SAVING TO COOKIE CACHE");
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue()
                + "; domain=" + cookie.getDomain();
        Log.d("Saving cookie: %s", cookieString);
        String[] keyValueSets = cookieString.split(";");
        if (keyValueSets.length == 0 || keyValueSets[0] == null) {
            break;
        }
        String[] keyValue = keyValueSets[0].split("=");
        if (keyValue.length == 0 || keyValue[0] == null) {
            break;
        }
        String key = keyValue[0];
        Log.d("Adding cookie with key %s and value %s", key, cookieString);
            Cookie co = new BasicClientCookie(key, cookieString);
        Log.print("Cookie domain: " + co.getDomain());
        Log.print("Cookie name: " + co.getName());
        Log.print("Cookie val: " + co.getValue());
        Log.print("Cookie comment: " + co.getComment());
        Log.print("Cookie commentUrl: " + co.getCommentURL());
        Log.print("Cookie path: " + co.getPath());
        Log.print("Cookie version: " + co.getVersion());
        Log.print("Cookie date: " + co.getExpiryDate());
        CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString);
        this.cacheManager.setString(TAG, cookie.getDomain());
    }
}
CookieSyncManager.getInstance().sync();

LogCat:

03-28 13:56:35.405: E/PRINTER(9714): SAVING TO COOKIE CACHE
03-28 13:56:35.405: D/Debug(9714): Saving cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22123e722edd173a295c1e8f3efae7c0ba%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%2287.32.150.212%22%3Bs%3A10%3A%22user_agent%22%3Bb%3A0%3Bs%3A13%3A%22last_activity%22%3Bi%3A1364471789%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D784e1b95d3e5b11fb969d137a67676bb; domain=test.address.lt
03-28 13:56:35.405: D/Debug(9714): Adding cookie with key ci_session and value ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22123e722edd173a295c1e8f3efae7c0ba%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%2287.32.150.212%22%3Bs%3A10%3A%22user_agent%22%3Bb%3A0%3Bs%3A13%3A%22last_activity%22%3Bi%3A1364471789%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D784e1b95d3e5b11fb969d137a67676bb; domain=test.address.lt
03-28 13:56:35.405: E/PRINTER(9714): Cookie domain: null
03-28 13:56:35.405: E/PRINTER(9714): Cookie name: ci_session
03-28 13:56:35.405: E/PRINTER(9714): Cookie val: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22123e722edd173a295c1e8f3efae7c0ba%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%2287.32.150.212%22%3Bs%3A10%3A%22user_agent%22%3Bb%3A0%3Bs%3A13%3A%22last_activity%22%3Bi%3A1364471789%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D784e1b95d3e5b11fb969d137a67676bb; domain=test.address.lt
03-28 13:56:35.405: E/PRINTER(9714): Cookie comment: null
03-28 13:56:35.405: E/PRINTER(9714): Cookie commentUrl: null
03-28 13:56:35.405: E/PRINTER(9714): Cookie path: null
03-28 13:56:35.405: E/PRINTER(9714): Cookie version: 0
03-28 13:56:35.405: E/PRINTER(9714): Cookie date: null
03-28 13:56:35.890: D/Debug(9714): Saving cookie: PHPSESSID=97eotn8964tgvv9j80uk8dddh5; domain=test.address.lt
03-28 13:56:35.890: D/Debug(9714): Adding cookie with key PHPSESSID and value PHPSESSID=97eotn8964tgvv9j80uk8dddh5; domain=test.address.lt
03-28 13:56:35.890: E/PRINTER(9714): Cookie domain: null
03-28 13:56:35.890: E/PRINTER(9714): Cookie name: PHPSESSID
03-28 13:56:35.890: E/PRINTER(9714): Cookie val: PHPSESSID=97eotn8964tgvv9j80uk8dddh5; domain=test.address.lt
03-28 13:56:35.890: E/PRINTER(9714): Cookie comment: null
03-28 13:56:35.890: E/PRINTER(9714): Cookie commentUrl: null
03-28 13:56:35.890: E/PRINTER(9714): Cookie path: null
03-28 13:56:35.890: E/PRINTER(9714): Cookie version: 0
03-28 13:56:35.890: E/PRINTER(9714): Cookie date: null

What am I doing wrong?

Upvotes: 1

Views: 2177

Answers (2)

Ramdane Oualitsen
Ramdane Oualitsen

Reputation: 400

To keep your session alive and store your cookies, you can actually implement the Cookie interface here is an example:

package com.transit.http;

import java.util.Date;
import org.apache.http.cookie.Cookie;

public class TransitCookie implements Cookie {

private String name;
private String value;
private String comment;
private String commentURL;
private String domain;
private String path;
private Date expiryDate;
private boolean persistent;
private boolean secure;
private int[] ports;
private int version;

@Override
public String getName() {

    return name;
}

@Override
public String getValue() {
    return value;
}

@Override
public String getComment() {
    return comment;
}

@Override
public String getCommentURL() {
    return commentURL;
}

@Override
public Date getExpiryDate() {
    return expiryDate;
}

@Override
public boolean isPersistent() {
    return persistent;
}

@Override
public String getDomain() {
    return domain;
}

@Override
public String getPath() {
    return path;
}

@Override
public int[] getPorts() {
    return ports;
}

@Override
public boolean isSecure() {
    return secure;
}

@Override
public int getVersion() {
    return version;
}

@Override
public boolean isExpired(Date date) {
    if (expiryDate != null) {
        return date.after(expiryDate);
    }
    /**
     * In this case, we must return false otherwise this cookie will be
     * rejected
     */
    return false;
}

public void setName(String name) {
    this.name = name;
}

public void setValue(String value) {
    this.value = value;
}

public void setComment(String comment) {
    this.comment = comment;
}

public void setCommentURL(String commentURL) {
    this.commentURL = commentURL;
}

public void setDomain(String domain) {
    this.domain = domain;
}

public void setPath(String path) {
    this.path = path;
}

public void setExpiryDate(Date expiryDate) {
    this.expiryDate = expiryDate;
}

public void setPersistent(boolean persistent) {
    this.persistent = persistent;
}

public void setSecure(boolean secure) {
    this.secure = secure;
}

public void setPorts(int[] ports) {
    this.ports = ports;
}

public void setVersion(int version) {
    this.version = version;
}

}

If you like to serialize it then implement the java.io.Serializable. Good luck.

Upvotes: 0

SMGhost
SMGhost

Reputation: 4037

I couldn't find any good documentation about BasicClientCookie, so I just decided to store all components like getDomain(), getValue(), etc. in string separated by special symbol sequance when closing program, and when program is later started again, I load that string from memory, parse separate values, and just use methods setDomain(), setValue(), etc. to create valid cookie. This seems to work just fine for now...

Upvotes: 2

Related Questions