Android会话pipe理

Android会话pipe理是否有特定的库? 我需要在一个正常的Android应用程序中pipe理我的会话。 不在WebView 。 我可以从我的post方法中设置会话。 但是当我发送另一个会话丢失的请求。 有人可以帮我解决这个问题吗?

 DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("My url"); HttpResponse response = httpClient.execute(httppost); List<Cookie> cookies = httpClient.getCookieStore().getCookies(); if (cookies.isEmpty()) { System.out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { System.out.println("- " + cookies.get(i).toString()); } } 

当我尝试访问会话丢失的同一台主机时:

 HttpGet httpGet = new HttpGet("my url 2"); HttpResponse response = httpClient.execute(httpGet); 

我得到login页面响应正文。

Solutions Collecting From Web of "Android会话pipe理"

这与Android无关。 它与Apache HttpClient(即用于HTTP访问的库)有关。

会话cookie存储在您的DefaultHttpClient对象中。 不要为每个请求创build一个新的DefaultHttpClient ,而是坚持使用它,并保持会话cookie。

您可以在这里阅读关于Apache HttpClient的信息,并在这里阅读HttpClient中的Cookiepipe理。

这是我使用的职位。 我可以用这个方法使用新的httpClients ,其中phpsessid是使用上面的代码从login脚本中提取的PHP会话ID。

 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid)); 

一般来说,在Java HttpURLConnection中,您可以通过这种方式设置/获取cookie(这里是整个连接过程)。 下面的代码在我的ConnectingThread的run()中,所有的连接活动类都从中inheritance。 全部共享与所有请求一起发送的通用静态sCookiestring。 因此,您可以保持一个常见的状态,如login/注销:

  HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //set cookie. sCookie is my static cookie string if(sCookie!=null && sCookie.length()>0){ conn.setRequestProperty("Cookie", sCookie); } // Send data OutputStream os = conn.getOutputStream(); os.write(mData.getBytes()); os.flush(); os.close(); // Get the response! int httpResponseCode = conn.getResponseCode(); if (httpResponseCode != HttpURLConnection.HTTP_OK){ throw new Exception("HTTP response code: "+httpResponseCode); } // Get the data and pass them to the XML parser InputStream inputStream = conn.getInputStream(); Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler); inputStream.close(); //Get the cookie String cookie = conn.getHeaderField("set-cookie"); if(cookie!=null && cookie.length()>0){ sCookie = cookie; } /* many cookies handling: String responseHeaderName = null; for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) { if (responseHeaderName.equals("Set-Cookie")) { String cookie = conn.getHeaderField(i); } }*/ conn.disconnect(); 

完全透明的方式来保持会话活跃(用户login,或其他)在Android应用程序。 它使用Singleton中的apache DefaultHttpClient和一个HttpRequest / Response拦截器。

SessionKeeper类只是检查其中一个标头是否为Set-Cookie,如果是,则只记得它。 SessionAdder只是将会话ID添加到请求中(如果不为空)。 这样,你的整个authentication过程是完全透明的。

 public class HTTPClients { private static DefaultHttpClient _defaultClient; private static String session_id; private static HTTPClients _me; private HTTPClients() { } public static DefaultHttpClient getDefaultHttpClient(){ if ( _defaultClient == null ) { _defaultClient = new DefaultHttpClient(); _me = new HTTPClients(); _defaultClient.addResponseInterceptor(_me.new SessionKeeper()); _defaultClient.addRequestInterceptor(_me.new SessionAdder()); } return _defaultClient; } private class SessionAdder implements HttpRequestInterceptor { @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { if ( session_id != null ) { request.setHeader("Cookie", session_id); } } } private class SessionKeeper implements HttpResponseInterceptor { @Override public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { Header[] headers = response.getHeaders("Set-Cookie"); if ( headers != null && headers.length == 1 ){ session_id = headers[0].getValue(); } } } }