我们有一个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();
通常情况下,基于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 }
要使用维护会话HttpURLConnection
则需要执行此部分
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
只有一次,不是每一个连接上。 很好的候选人可以在内部应用程序启动Application.onCreate();