会话 cookie 在模拟器上可以工作,但在真实设备上无法工作。

4

我正在使用Android 2.1开发应用程序。

在使用会话Cookie登录RESTful Web服务时,遇到了问题。代码在模拟器上运行良好,但在我的HTC Magic上运行时,Cookie逻辑不起作用。通过列出Cookie列表(请参见附图),我确认Magic已经在标头中接收到Cookie。有谁能解释为什么Cookie存储区为空,即使它们在标头中也是如此?

  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

更新 - 我已经在另外两部手机上尝试过了,它们都可以正常工作。但其中一部手机无法处理cookies。唉。 - mvsjes2
1个回答

3

好的,这实际上是一次在Apache代码中的寻找。归根结底,问题是cookie已经过期了,所以cookiestore没有任何解释地将它们丢弃了。结果发现手机设置中没有勾选“使用网络日期/时间”。一旦我勾选了这个选项,应用程序就正常工作了。但仍然令人困惑-本地时间已正确设置(误差不超过2分钟)。

来自org.apache.http.impl.client.BasicCookieStore/addCookie:

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

在 PHP 中,我使用了 setCookie("cookieName",$value,$time()+3600) 而不是 $_COOKIE['cookieName'],它可以正常工作! - Eamorr
@mvsjes2 你好,我也遇到了同样的问题,并尝试按照你的答案实现,但问题仍未解决。 - Chintan Khetiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接