Android客户端与服务器端交互,如何保持session回话
前言
最近在開發項目的過程中,遇到Android與web服務器要在同一session下通信的問題。
一、Session與Cookie的共性與區別:
①、共性
Cookie和Session都為了用來保存狀態信息,都是保存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做的努力。
Session可以用Cookie來實現,也可以用URL回寫的機制來實現。
②、區別
1)Cookie將狀態保存在客戶端,Session將狀態保存在服務器端;
2)Cookies是服務器在本地機器上存儲的小段文本并隨每一個請求發送至同一個服務器。網絡服務器用HTTP頭向客戶端發送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個本地文件,它會自動將同一服務器的任何請求縛上這些cookies。
3)Session是針對每一個用戶的,變量的值保存在服務器上,用一個sessionID來區分是不同用戶session變量,這個值是通過用戶的瀏覽器在訪問的時候返回給服務器,當客戶禁用cookie時,這個值也可能設置為由get來返回給服務器;
4)就安全性來說:當你訪問一個使用session 的站點,同時在自己機器上建立一個cookie,建議在服務器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。
二、Session機制
1)Session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。
2)當程序需要為某個客戶端的請求創建一個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() 。
?
四、總結
回顧完Session和Cookie,那么問題來了,為什么手機端與服務器交互沒有實現在同一session下?
1)原因很簡單,就是因為android手機端在訪問web服務器時,沒有給http請求頭部設置sessionID,而使用web瀏覽器作為客戶端訪問服務器時,在客戶端每次發起請求的時候,都會將交互中的sessionID:JSESSIONID設置在Cookie頭中攜帶過去,服務器根據這個sessionID獲取對應的Session,而不是重新創建一個新Session(除了這個Session失效)。
以Java.NET.HttpURLConnection發起請求為例:
獲取Cookie: URL url = new URL(requrl);HttpURLConnection con= (HttpURLConnection) url.openConnection(); // 取得sessionid. String cookieval = con.getHeaderField("set-cookie"); String sessionid; if(cookieval != null) { sessionid = cookieval.substring(0, cookieval.indexOf(";")); } //sessionid值格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是鍵值對,不是單指值 發送設置cookie: URL url = new URL(requrl); HttpURLConnectioncon= (HttpURLConnection) url.openConnection(); if(sessionid != null) { con.setRequestProperty("cookie", sessionid); }
只要設置了sessionID,這樣web服務器在接受請求的時候就會自動搜索對應的session了,從而保證了在同一會話Session。
以下是我個人總結出來的Http請求的代碼:
private static String session_id = null;public static String httpRequest(String requrl) {String result = null;// 請求返回的字符串try {URL url = new URL(requrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");if (session_id != null) {con.setRequestProperty("Cookie", session_id);//設置sessionid}InputStream is = con.getInputStream();String cookieval = con.getHeaderField("Set-Cookie");if (cookieval != null) {session_id = cookieval.substring(0, cookieval.indexOf(";"));//獲取sessionidL.w("SESSION", "session_id=" + session_id);}ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) > 0) {bos.write(buffer, 0, len);}bos.flush();is.close();byte[] resultbyte = bos.toByteArray();result = bos.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}
注:如果你使用了OKHttp的開發框架,那么在下一章Android OKHttp的使用心得中會有介紹遇到session過期問題如何使用OKHttp保持session的會話
參考
http://blog.csdn.net/zxc123e/article/details/41698027
http://blog.csdn.net/yaochangliang159/article/details/50433682
總結
以上是生活随笔為你收集整理的Android客户端与服务器端交互,如何保持session回话的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android-support-v4 v
- 下一篇: Android OkHttp的使用心得