分享

HttpClient 和 HttpURLConnection 共用session

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

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


  1. List<Cookie> cookies = client.getCookieStore().getCookies();
  2. Cookie cookie = null;
  3. String sessionId = null;
  4. for (int i = 0; i < cookies.size(); i++) {
  5. cookie = cookies.get(i);
  6. if("jsessionid".equalsIgnoreCase(cookie.getName())){
  7. sessionId = cookie.getValue();
  8. LogUtil.i(TAG, "cookieId="+sessionId);
  9. PreferenceUtils.setData("cookie", sessionId);
  10. }
  11. }
复制代码

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


下面就是使用SessionId来共享Session



  1. URL m = new URL(url);
  2. HttpURLConnection connection = (HttpURLConnection) m.openConnection();
  3. String cookie = PreferenceUtils.getData("cookie");
  4. connection.setRequestProperty("Cookie", "JSESSIONID="+cookie);
  5. InputStream inputStream = connection.getInputStream();
复制代码

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


原文链接:http://blog.csdn.net/vipa1888/article/details/9095157

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多