【问题标题】:Using DefaultHttpClient between Activities在活动之间使用 DefaultHttpClient
【发布时间】:2012-01-02 12:13:45
【问题描述】:

我有一个 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));
}

由于某种原因,他不再登录了。

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

【问题讨论】:

  • 如何从另一个活动中获取原始的httpClient?发布您的 clientWithoutCertificateCheck() 方法可能会帮助其他人找到您的问题。
  • 我改进了这个问题。在两个活动中重复第一段代码以获得新的 Http 客户端。

标签: java android cookies httpclient


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多