HttpClient 和 HttpURLConnection 共用session

     最近又开始折腾android项目了,项目中需要请求服务器段的接口,又要涉及到图片的资源,比较纠结的是,我开始着手这个项目的时候,网络请求的框架已经完成了,现在存在一个问题就是,请求接口的使用的是HttpClient,这个是已经封装好了,不方便修改的,但是图片下载,如果这套框架的话,很不方便(涉及到多线程下载图片和缓存),挺纠结的,打算用他的框架,但是ListView中的列表图片用HttpClient下载有点太浪费,决定使用HttpURLConnection来下载,就在开始做的时候,遇到了一个很纠结的问题,这个软件需要登录的,登录的时候使用的是HttpClient,这个时候,保存的Session就在HttpClient了,如果我使用HttpURLConnection下载图片的话,服务器发现我的请求没有包含Session,直接跳转到登录界面了,挺纠结的,最后就想到了使用HttpClient HttpURLConnection 共用session,针对这个问题,没搞过,查了一下资料,其实客户端保存的Session就是一个cookie,针对这个问题,自己测试研究了一下,最终还是搞定了,写一下大致的方法:


如果使用HttpClient登录的话,会从服务器段获取到一个SessionID,得到SessionID的代码如下:

			List<Cookie> cookies = client.getCookieStore().getCookies();
			Cookie cookie = null;
			String sessionId = null;
			for (int i = 0; i < cookies.size(); i++) {
				cookie = cookies.get(i);
				if("jsessionid".equalsIgnoreCase(cookie.getName())){
					sessionId = cookie.getValue();
					LogUtil.i(TAG, "cookieId="+sessionId);
					PreferenceUtils.setData("cookie", sessionId);
				}
			}



以上代码中,SessionId就是登录成功后,得到的SessionId,可以把这个Session保存下来(PreferenceUtils.setData这个方法就是我保存的方法)



下面就是使用SessionId来共享Session

			URL m = new URL(url);
			HttpURLConnection connection = (HttpURLConnection) m.openConnection();
			String cookie = PreferenceUtils.getData("cookie");
			connection.setRequestProperty("Cookie", "JSESSIONID="+cookie);
			InputStream inputStream = connection.getInputStream();


上面的代码:PreferenceUtils.getData是我获取刚才保存SessionId的方法

connection.setRequestPreperty这个方法,其实就是给HttpURLConnection添加Header session能与服务器保持回话,其实就是每次请求加上一个Header,这个headerkey就是“Cookie” Value就是“JSESSION=sessionId” 注意大小写,使用的时候,请把sessionId替换成登录成功后获取到的sessionID;相关的技术点就这些,主要还是sessionID的共享!



posted @ 2013-06-14 15:41  spring_sky  阅读(924)  评论(0编辑  收藏  举报