最近又开始折腾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,这个header的key就是“Cookie”, Value就是“JSESSION=sessionId”。 注意大小写,使用的时候,请把sessionId替换成登录成功后获取到的sessionID;相关的技术点就这些,主要还是sessionID的共享!