java - httpClient 无法在我的 Android 应用程序中保留带有许多异步请求的 cookie

标签 java android cookies httpclient

我正在使用 HttpClient 和 ClientConnectionManager 来管理 andorid 中的 http 请求。下面的MyHttp类是唯一处理所有http方法的类。

但是对于许多异步http请求,我发现httpClient无法发送正确的cookie。例如,在我的应用程序中,应用程序启动时有五个请求。但是有两种类型的 cookie 从服务器获取和发送到服务器。在服务器端。你能给我什么建议吗?

PS: 我有另一个web项目和ios项目使用相同的api服务器,它们在cookie处理上都是正确的。

MyHttp 是我的 BaseActivity 中的实例化,它扩展了 Activtiy

public class MyHttp {
    public static HttpClient  httpClient;
    public static HttpContext localContext;

    public MyHttp() {

    }

    public String getHttp(String url) throws Exception {
        String result = "";
        HttpGet getMethod = new HttpGet(url);
        getMethod.addHeader("Content-Type","application/json");
        HttpResponse response = httpClient.execute(getMethod,localContext);

        if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
            result = EntityUtils.toString(response.getEntity(), "utf-8");
        }    
        return result;
    }



    public static synchronized HttpClient getHttpClient() {
        /**cookie*/
        CookieStore cookieStore = new BasicCookieStore();
        // Create local HTTP context
        localContext = new BasicHttpContext();
        // Bind custom cookie store to the local context
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
        if (null == httpClient) {
            // 初始化工作
            HttpParams params = new BasicHttpParams();

            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

            // 设置http https支持
            SchemeRegistry schReg = new SchemeRegistry();
            schReg.register(new Scheme("http", PlainSocketFactory
                    .getSocketFactory(), 80));
            schReg.register(new Scheme("https", sf, 443));

            ClientConnectionManager conManager = new ThreadSafeClientConnManager(
                    params, schReg);

            httpClient = new DefaultHttpClient(conManager, params);
        }
        return httpClient;
    }

}

最佳答案

getHttpClient() 方法中,您将在每次调用时创建 BasicCookieStoreBasicHttpContext 的新实例。这将导致不同时间使用不同的 cookie 存储,并可能导致 cookie 丢失。

我建议您仅实例化 localContext 一次,并在每次发出请求时重用该实例。

P.S.我真的建议你不要使用HttpClient。 Google 将不再支持它,您不应该在上面投入时间。最好使用 HttpUrlConnection 或一些可用的 HTTP 通信框架 - Volley、OkHttp、Retrofit 等。

关于java - httpClient 无法在我的 Android 应用程序中保留带有许多异步请求的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623768/

相关文章:

java - node.js 是否可以导入 java 库

java - 在android java中访问方法的问题

android - Coordinator布局和权重

android - BnCameraService中的字符 'n'和BpCameraService中的 'p'是什么意思?

javascript - Nextjs - 存储在内存中的身份验证 token + 仅 HTTP cookie 中的刷新 token

windows - Web 应用程序 Kerberos 身份验证 : Is the proper way to combine with cookies?

java - 需要 Java 库——用于远程(例如 S3)文件的本地文件缓存

Java 抛出 java.io.FileNotFoundException

c# - MVC4 : After server restart, 无法发布 ajax 内部服务器错误 500

Java编程