最近又開始折騰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的共享!