2010-10-15 15 views
2

Je développe une application en utilisant android 2.1.les cookies de session fonctionnent sur l'émulateur, mais pas sur le vrai périphérique

J'ai un problème avec l'utilisation de cookies de session pour me connecter à un service Web RESTful. Le code fonctionne bien sur l'émulateur, mais lorsque je l'exécute sur mon HTC Magic, la logique des cookies ne fonctionne pas. J'ai confirmé que la magie reçoit des cookies dans les en-têtes en les listant (voir ci-joint). Quelqu'un peut-il dire pourquoi le magasin de cookies serait vide même s'ils sont dans les en-têtes?

public HttpProvider() { 
    Scheme http = new Scheme("http", new PlainSocketFactory(), 80); 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(http); 

    client = new DefaultHttpClient(new ThreadSafeClientConnManager((new BasicHttpParams()), registry), new BasicHttpParams()); 
    } 

    public void get(Request request) { 
    try { 
     HttpGet get = new HttpGet(request.url); 
     HttpResponse response = client.execute(get); 
     debugListHeaders(response, request.ticket); 
     debugListCookies(); 
    } 
    } 

    void debugListHeaders(HttpResponse response, int ticket) { 
    Header[] headers = response.getAllHeaders(); 
    Log.d(LOG, "Printing all headers" + " (" + ticket + ")"); 
    for (Header header : headers) { 
     Log.d(LOG, "Header name: " + header.getName() + ", value: " + header.getValue() + " (" + ticket + ")"); 
    } 
    Log.d(LOG, "All headers have been printed" + " (" + ticket + ")"); 
    } 

    void debugListCookies() { 
    Log.d(LOG, "List cookies for connection"); 
    for (Cookie cookie : client.getCookieStore().getCookies()) { 
     Log.d(LOG, 
     "Domain: " + cookie.getDomain() + 
     " Name: " + cookie.getName() + 
     " Path: " + cookie.getPath() + 
     " Value: " + cookie.getValue() + 
     " Expires: " + cookie.getExpiryDate().toString() + 
     " IsExpired: " + (cookie.isExpired(new Date()) ? "true" : "false")); 
    } 
    Log.d(LOG, "All cookies have been listed"); 
    } 

Thru the emulator: 
<snipped header list as it's obviously working> 
D/SessionProvider( 257): List cookies for connection 
D/SessionProvider( 257): Domain:<snip> Name: S Path:/Value: 75XGSMR3BLLGYM0J Expires: Tue Oct 12 20:24:09 America/Barbados 2010 
IsExpired: false 
D/SessionProvider( 257): Domain: <snip> Name: lang Path:/Value: en Expires: Tue Oct 12 20:24:09 America/Barbados 2010 IsExpired: false 
D/SessionProvider( 257): All cookies have been listed 


Thru HTC Magic: 
D/HttpProvider( 983): Printing all headers (-192275970) 
D/HttpProvider( 983): Header name: Date, value: Thu, 14 Oct 2010 22:44:38 GMT (-192275970) 
D/HttpProvider( 983): Header name: Server, value: Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_perl/2.0.4 Perl/v5.10.0 (-192275970) 
D/HttpProvider( 983): Header name: Set-Cookie, value: S=S41GM85A675Z8YQU; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970) 
D/HttpProvider( 983): Header name: Set-Cookie, value: U=nibor.yarrum%40gmail.com; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970) 
D/HttpProvider( 983): Header name: Set-Cookie, value: lang=en; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970) 
D/HttpProvider( 983): Header name: Vary, value: Accept-Encoding (-192275970) 
D/HttpProvider( 983): Header name: Keep-Alive, value: timeout=15, max=100 (-192275970) 
D/HttpProvider( 983): Header name: Connection, value: Keep-Alive (-192275970) 
D/HttpProvider( 983): Header name: Transfer-Encoding, value: chunked (-192275970) 
D/HttpProvider( 983): Header name: Content-Type, value: text/html (-192275970) 
D/HttpProvider( 983): All headers have been printed (-192275970) 
I/HttpProvider( 983): Request completed (-192275970) 
D/SessionProvider( 983): List cookies for connection 
D/SessionProvider( 983): All cookies have been listed 
+0

Mise à jour - J'ai essayé cela sur deux téléphones et ils fonctionnent bien tous les deux. Un téléphone ne gère pas les cookies. Soupir. – mvsjes2

Répondre

2

Eh bien, cela s'est avéré être une expédition de chasse dans le code apache. Ce que cela signifiait, c'était que les cookies étaient déjà expirés, donc cookiestore les a jetés sans explication. Il s'avère que le téléphone n'avait pas «utiliser la date/heure du réseau» vérifié sur les paramètres. Dès que je l'ai fait, l'application a bien fonctionné. Il est toujours curieux - l'heure locale a été réglée correctement (dans les 2 minutes).

De org.apache.http.impl.client.BasicCookieStore/addCookie:

94 if (!cookie.isExpired(new Date())) { 
95  cookies.add(cookie); 
+0

En PHP, au lieu d'utiliser '$ _COOKIE ['cookieName']', j'ai fait 'setCookie (" cookieName ", $ value, $ time() + 3600)' et ça marche! – Eamorr

+0

@ mvsjes2 Hey, j'ai le même problème et j'essaie d'implémenter votre réponse, mais la question n'est pas résolue. –