重用HttpURLConnection以使会话保持活动状态

时间:2012-05-23 06:58:11

标签: android httpurlconnection sessionid

我们有一个Android应用程序,要求用户输入Captcha的答案。 Captcha是在我们的服务器上生成的。 回复时,会将其发送到服务器进行验证。

问题是,因为我必须在请求Captcha之后关闭HttpURLConnection,然后发现回复正在服务器上的另一个会话上运行。 因此,Captcha检查失败,因为它取决于会话。

有没有办法让连接保持活动状态,还是应该遵循不同的路径? 我知道在相应的iPhone应用程序中,它们保持“连接”状态,因此具有相同的sessionid。

编辑:

    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();

2 个答案:

答案 0 :(得分:13)

通常,会话不会基于http连接本身保留。这没有任何意义。会话通常通过客户端的cookie和服务器端的会话信息保持活动状态。 你要做的就是保存你接收的cookie,然后在下次连接服务器时设置那些(那些)cookie。

要了解有关如何使用HttpUrlConnection类处理会话和cookie的更多信息,请阅读文档:http://developer.android.com/reference/java/net/HttpURLConnection.html

这里有一些摘录让你开始:

  

建立并维持一个可能长期存在的会话   客户端和服务器,HttpURLConnection包含一个可扩展的cookie   经理。使用CookieHandler和。启用VM范围的cookie管理   CookieManager:

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库,您需要以某种方式" connect"带有连接对象的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     }

答案 1 :(得分:11)

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

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

只有一次而不是每次连接。好的候选人可以在Application.onCreate();

内启动应用程序