android http請求實現session管理
session一般儲存在Cookie當中,首先我們瞭解一下session和cookie
Cookie和Session都為了用來儲存狀態資訊,都是儲存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做的努力。
Session可以用Cookie來實現,也可以用URL回寫的機制來實現。
Cookie和Session有以下明顯的不同點:
1)Cookie將狀態儲存在客戶端,Session將狀態儲存在伺服器端;
2)Cookies是伺服器在本地機器上儲存的小段文字並隨每一個請求傳送至同一個伺服器。網路伺服器用HTTP頭向客戶端傳送cookies,在客戶終端,瀏覽器解析這些cookies並將它們儲存為一個本地檔案,它會自動將同一伺服器的任何請求縛上這些cookies。
3)Session是針對每一個使用者的,變數的值儲存在伺服器上,用一個sessionID來區分是不同使用者session變數,這個值是通過使用者的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設定為由get來返回給伺服器;
4)就安全性來說:當你訪問一個使用session 的站點,同時在自己機器上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶儲存的資訊。
Session機制
Session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。
當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個 session id將被在本次響應中返回給客戶端儲存。
Session的實現方式
1 ) 使用Cookie來實現
伺服器給每個Session分配一個唯一的JSESSIONID,並通過Cookie傳送給客戶端。
當客戶端發起新的請求的時候,將在Cookie頭中攜帶這個JSESSIONID。這樣伺服器能夠找到這個客戶端對應的Session。
2 )使用URL回顯來實現
URL回寫是指伺服器在傳送給瀏覽器頁面的所有連結中都攜帶JSESSIONID的引數,這樣客戶端點選任何一個連結都會把JSESSIONID帶給伺服器。
如果直接在瀏覽器中輸入url來請求資源,Session是匹配不到的。
Tomcat對 Session的實現,是一開始同時使用Cookie和URL回寫機制,如果發現客戶端支援Cookie,就繼續使用Cookie,停止使用URL回寫。如果發現Cookie被禁用,就一直使用URL回寫。jsp開發處理到Session的時候,對頁面中的連結記得使用 response.encodeURL() 。
在專案中,我們一般使用HttpClient像如下這樣來發起web請求:
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
這樣當第一次請求完成之後就可以從httpClient中得到cookie
CookieStore cookieStore = httpClient.getCookieStore();
在cookieStore中會帶有服務端生成的JSESSIONID
這樣,我們可以生成一個全域性的靜態變數CookieStore,
在第一次請求成功之後,將返回的Cookie儲存到這個全域性的CookieStore中
完整程式碼如下:
public static CookieStore cookieStore;
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.setCookieStore(cookieStore);
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
if (statusCode == HttpStatus.SC_OK) {
CookieStore cookieStore = httpClient.getCookieStore();
cookieStore = cookieStore;
}
這樣就可以保證在每次Http請求是帶上SESSIONID
在做專案時採用的是android原生+html的混合開發模式,登陸
採用的是android,因此在登陸之後,載入html頁面是就要將Cookie放到
WebView中,
採用的方式如下,
if (null != NetUtil.cookieStore) {
CookieSyncManager.createInstance(getApplicationContext());
cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
}
// 在removeSessionCookie()之後要Sleep一段時間,cookie才能set進去,不知道為什麼
SystemClock.sleep(100);
//然後將Cookie存放的CokieManager中
if (null != NetUtil.cookieStore) {
List<Cookie> cookies = CRMRemoteHandler.cookieStore
.getCookies();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieString = cookie.getName() + "="
+ cookie.getValue() + "; domain="
+ cookie.getDomain();
System.out.println(cookieString);
cookieManager.setCookie(cookie.getDomain(), cookieString);
}
CookieSyncManager.getInstance().sync();
}