the*_*itz 12 android sessionid httpurlconnection
我们有一个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();
Run Code Online (Sandbox Code Playgroud)
Dal*_*osa 13
通常,会话不会基于http连接本身保留.这没有任何意义.会话通常通过客户端的cookie和服务器端的会话信息保持活动状态.你要做的是保存你正在接收的cookie,然后在下次连接到服务器时设置那些(那些)cookie.
要了解有关如何使用HttpUrlConnection类处理会话和cookie的更多信息,请阅读以下文档:http://developer.android.com/reference/java/net/HttpURLConnection.html
这里有一些摘录可以帮助您入门:
为了在客户端和服务器之间建立和维护可能长期存在的会话,HttpURLConnection包括一个可扩展的cookie管理器.使用CookieHandler和CookieManager启用VM范围的cookie管理:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
Run Code Online (Sandbox Code Playgroud)
编辑:
对于使用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);
Run Code Online (Sandbox Code Playgroud)
上面的代码取自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 }
Run Code Online (Sandbox Code Playgroud)
Gri*_* A. 11
要使用维护会话,HttpURLConnection您需要执行此部分
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
Run Code Online (Sandbox Code Playgroud)
只有一次,而不是每个连接.好的候选人可以在内部申请发布Application.onCreate();
| 归档时间: |
|
| 查看次数: |
21947 次 |
| 最近记录: |