Android 会话cookie可以在模拟器上工作,但不能在真实设备上工作
我正在用安卓2.1开发一个应用程序 我在使用会话cookie登录RESTful web服务时遇到问题。代码在模拟器上运行良好,但当我在HTC Magic上运行它时,cookie逻辑不起作用。我已经通过列出这些cookie来确认magic正在接收标题中的cookie(见附件)。有人能说出为什么cookie存储即使在标题中也是空的吗Android 会话cookie可以在模拟器上工作,但不能在真实设备上工作,android,session,cookies,httpclient,cookiestore,Android,Session,Cookies,Httpclient,Cookiestore,我正在用安卓2.1开发一个应用程序 我在使用会话cookie登录RESTful web服务时遇到问题。代码在模拟器上运行良好,但当我在HTC Magic上运行它时,cookie逻辑不起作用。我已经通过列出这些cookie来确认magic正在接收标题中的cookie(见附件)。有人能说出为什么cookie存储即使在标题中也是空的吗 public HttpProvider() { Scheme http = new Scheme("http", new PlainSocketFactor
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
公共HttpProvider(){
方案http=新方案(“http”,新的PlainSocketFactory(),80);
SchemeRegistry registry=新SchemeRegistry();
registry.register(http);
client=new DefaultHttpClient(new ThreadSafeClientConnManager((new BasicHttpParams()),registry),new BasicHttpParams());
}
公共作废获取(请求){
试一试{
HttpGet=newhttpget(request.url);
HttpResponse response=client.execute(get);
DebugListHeader(响应、请求、票证);
debugListCookies();
}
}
void debugListHeaders(HttpResponse响应,int票据){
Header[]headers=response.getAllHeaders();
Log.d(Log,“打印所有标题“+”(“+ticket+”));
用于(标题:标题){
Log.d(日志,“头名称:“+Header.getName()+”,值:“+Header.getValue()+”(“+ticket+”));
}
Log.d(Log,“所有标题均已打印”+“(“+ticket+”));
}
void debugListCookies(){
Log.d(Log,“列出连接的cookies”);
对于(Cookie Cookie:client.getCookieStore().getCookies()){
Log.d(Log,
域:“+cookie.getDomain()+
“名称:”+cookie.getName()+
路径:“+cookie.getPath()+
“值:”+cookie.getValue()+
Expires:“+cookie.GetExpireyDate().toString()+
“IsExpired:”+(cookie.IsExpired(new Date())?“true”:“false”);
}
Log.d(Log,“已列出所有cookie”);
}
通过模拟器:
事实证明,这是apache代码中的一次狩猎探险。归根结底,这些饼干已经过期了,所以cookiestore没有任何解释就把它们扔掉了。结果表明,手机的设置中没有选中“使用网络日期/时间”。我一这么做,这个应用程序就运行得很好。这仍然令人费解-当地时间设置正确(在2分钟内) 从org.apache.http.impl.client.BasicCookieStore/addCookie:
94 if (!cookie.isExpired(new Date())) {
95 cookies.add(cookie);
更新-我在另外两部手机上试用过,它们都很好用。一部手机不能处理cookies。叹气。在PHP中,我没有使用
$\uCookie['cookieName']
,而是使用setCookie(“cookieName”、$value、$time()+3600)
,它可以工作@mvsjes2嘿,我有同样的问题,并试图实现你们的答案,但问题并没有解决。