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的共享!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章