-->

重用HttpURLConnection类,以保持会话活着(Reusing HttpURLConnec

2019-06-24 17:12发布

我们有一个Android应用程序,要求用户输入一个答案,一个验证码。 Captcha验证码是我们的服务器上生成。 当答复,它被发送到服务器验证。

问题是,由于我对Captcha验证码请求后关闭HttpURLConnection的我,然后发现,该答复上的服务器不同的会话中运行。 由于这个原因,因为它是会话取决于验证码校验失败。

有没有一种方法保持连接活着,还是我应该遵循不同的路径? 我知道,他们仍然相当于iPhone应用程序“连接”,从而具有相同的会话ID。

编辑:

    CookieManager cookieManager = new CookieManager();  
    CookieHandler.setDefault(cookieManager);

    URL urlObj = new URL(urlPath);
    conn = (HttpURLConnection) urlObj.openConnection();

    if (urlPath.toLowerCase().startsWith("https:")) {
        initializeHttpsConnection((HttpsURLConnection) conn);
    }
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Language", "en-US");
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length));
    if (_sessionIdCookie != null) {
        conn.setRequestProperty("Cookie", _sessionIdCookie);
    }
    // Connect
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.connect();

Answer 1:

通常情况下,基于HTTP连接本身会话不会保留。 这将没有任何意义。 会议通常是通过在服务器端的客户端和会话信息饼干维持生命。 你必须做的是保存您收到该cookie(一个或多个),然后设置您连接到服务器(那些)饼干(S)下一次。

要了解更多关于如何使用与HttpURLConnection的课堂,并且Cookie的工作,阅读文档: http://developer.android.com/reference/java/net/HttpURLConnection.html

这里一个小片段,让你开始:

为了建立和维护客户端和服务器之间的潜在长寿命的会议,HttpURLConnection类包括一个可扩展的cookie管理器。 启用使用的CookieHandler和CookieManager VM级cookie管理:

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);

编辑:

对于那些API级别8或更低的工作,你需要使用Apache的图书馆!

下面是一些参考代码:

 // Create a local instance of cookie store
    CookieStore cookieStore = new BasicCookieStore();

    // Create local HTTP context
    HttpContext localContext = new BasicHttpContext();
    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI());

    // Pass local context as a parameter
    HttpResponse response = httpclient.execute(httpget, localContext);

上面的代码是从Apache的库例子服用。 它可以在这里找到: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

编辑2: 这就很清楚:

对于Apache库,你需要以某种方式与连接对象“连接” cookie的管理对象和你做,通过HttpContext对象。

在HttpURLConnection类的情况下,这是没有必要的。 当您使用的CookieHandler的静态方法setDefault,你设置系统范围的CookieHandler。 下面是CookieHandler.java的摘录。 请注意,变量名(从Android开源项目的(AOSP)库):

 37 /**
 38      * Sets the system-wide cookie handler.
 39      */
 40     public static void setDefault(CookieHandler cHandler) {
 41         systemWideCookieHandler = cHandler;
 42     }


Answer 2:

要使用维护会话HttpURLConnection则需要执行此部分

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);

只有一次,不是每一个连接上。 很好的候选人可以在内部应用程序启动Application.onCreate();



文章来源: Reusing HttpURLConnection so as to keep session alive