2011-11-20 80 views
0

我有没有为我在两个活动使用证书检查的DefaultHttpClient:使用DefaultHttpClient活动之间

public function clientWithoutCertificateCheck() { 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    try{ 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 

     SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 
     httpClient = new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { } 

    return httpClient; 
} 

而且它在这同样的活动内页登录。

启动后,其他活动我保存它的cookie:

CookieSyncManager.createInstance(this); 
List<Cookie> cookies = httpClient.getCookieStore().getCookies(); 
for(Cookie cookie : cookies) 
{ 
    String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();       
    CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString); 
} 

然后我试图得到相同的HttpClient在另一个活动。

DefaultHttpClient httpClient = clientWithoutCertificateCheck(); 
String url = "https://academicos.unilasalle.edu.br/"; 
String[] keyValueSets = CookieManager.getInstance().getCookie(url).split(";"); 
for(String cookie : keyValueSets) 
{ 
    String[] keyValue = cookie.split("="); 
    String key = keyValue[0]; 
    String value = ""; 
    if(keyValue.length>1) value = keyValue[1]; 
    httpClient.getCookieStore().addCookie(new BasicClientCookie(key, value)); 
} 

由于某种原因,他没有再登录。

有人可以帮我解决这个问题吗?

+0

如何从其他活动获取原始httpClient?发布您的clientWithoutCertificateCheck()方法可能会帮助其他人找到您的问题。 – yorkw

+0

我改进了这个问题。为了获得一个新的Http客户端,第一部分代码在这两个活动中都得到了重复。 –

回答

0

根据你的代码,显然通过调用clientWithoutCertificateCheck()总是返回一个新创建的httpClient,与前面的活动不一样。所以在服务器端,它可能认为这些是不同的传入连接并与不同的会话/ cookie相关联。

活动的生命周期是相当短暂的,通常它在应用程序运行时间内被创建/销毁很多次。从我的角度来看,将httpClient绑定到Activity是不合理的。 如果您想保留/使用单个httpClient实例交互活动,请考虑使用服务,实施/集中您的http相关内容到您的HttpService中,并为需要使用http服务的所有活动启动/绑定服务。希望有所帮助。