天天看點

Android -- 與WEB互動在同一個會話Session中通信

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 id,如果已包含一個session id則說明以前已經為此用戶端建立過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會建立一個),如果用戶端請求不包含session id,則為此用戶端建立一個session并且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字元串,這個 session id将被在本次響應中傳回給用戶端儲存。

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() 。

原因很簡單,就是因為android手機端在通路web伺服器時,沒有給http請求頭部設定sessionID,而使用web浏覽器作為用戶端通路伺服器時,在用戶端每次發起請求的時候,都會将互動中的sessionID:JSESSIONID設定在Cookie頭中攜帶過去,伺服器根據這個sessionID擷取對應的Session,而不是重新建立一個新Session(除了這個Session失效)。

Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信

隻要存在一個HttpClient對象就可以了,這個HttpClient對象中就包含得有Cookie資訊。

我在工程中是使用的單例模式實作的:

Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信

兩個線程中就可以使用同一個cookie通路了。

通過将SessionId的值通過url傳遞到想繼續在同一會話中通路的頁面。

php代碼:test2.php

Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信

test3.php

Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信

Android上的代碼(這裡我們分别new兩個HttpClient做測試):

Android -- 與WEB互動在同一個會話Session中通信
Android -- 與WEB互動在同一個會話Session中通信

Session_id($_GET['id']); 這句話很重要。