Android客户端与服务器端交互,如何保持session回话
前言
最近在開(kāi)發(fā)項(xiàng)目的過(guò)程中,遇到Android與web服務(wù)器要在同一session下通信的問(wèn)題。
一、Session與Cookie的共性與區(qū)別:
①、共性
Cookie和Session都為了用來(lái)保存狀態(tài)信息,都是保存客戶端狀態(tài)的機(jī)制,它們都是為了解決HTTP無(wú)狀態(tài)的問(wèn)題而所做的努力。
Session可以用Cookie來(lái)實(shí)現(xiàn),也可以用URL回寫的機(jī)制來(lái)實(shí)現(xiàn)。
②、區(qū)別
1)Cookie將狀態(tài)保存在客戶端,Session將狀態(tài)保存在服務(wù)器端;
2)Cookies是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。網(wǎng)絡(luò)服務(wù)器用HTTP頭向客戶端發(fā)送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個(gè)本地文件,它會(huì)自動(dòng)將同一服務(wù)器的任何請(qǐng)求縛上這些cookies。
3)Session是針對(duì)每一個(gè)用戶的,變量的值保存在服務(wù)器上,用一個(gè)sessionID來(lái)區(qū)分是不同用戶session變量,這個(gè)值是通過(guò)用戶的瀏覽器在訪問(wèn)的時(shí)候返回給服務(wù)器,當(dāng)客戶禁用cookie時(shí),這個(gè)值也可能設(shè)置為由get來(lái)返回給服務(wù)器;
4)就安全性來(lái)說(shuō):當(dāng)你訪問(wèn)一個(gè)使用session 的站點(diǎn),同時(shí)在自己機(jī)器上建立一個(gè)cookie,建議在服務(wù)器端的SESSION機(jī)制更安全些.因?yàn)樗粫?huì)任意讀取客戶存儲(chǔ)的信息。
二、Session機(jī)制
1)Session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
2)當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí) - 稱為 session id,如果已包含一個(gè)session id則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè) session檢索出來(lái)使用(如果檢索不到,可能會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè) session id將被在本次響應(yīng)中返回給客戶端保存。
三、Session的實(shí)現(xiàn)方式
1 )?使用Cookie來(lái)實(shí)現(xiàn)
服務(wù)器給每個(gè)Session分配一個(gè)唯一的JSESSIONID,并通過(guò)Cookie發(fā)送給客戶端。
當(dāng)客戶端發(fā)起新的請(qǐng)求的時(shí)候,將在Cookie頭中攜帶這個(gè)JSESSIONID。這樣服務(wù)器能夠找到這個(gè)客戶端對(duì)應(yīng)的Session。
?2 )使用URL回顯來(lái)實(shí)現(xiàn)
URL回寫是指服務(wù)器在發(fā)送給瀏覽器頁(yè)面的所有鏈接中都攜帶JSESSIONID的參數(shù),這樣客戶端點(diǎn)擊任何一個(gè)鏈接都會(huì)把JSESSIONID帶給服務(wù)器。如果直接在瀏覽器中輸入url來(lái)請(qǐng)求資源,Session是匹配不到的。
Tomcat對(duì) Session的實(shí)現(xiàn),是一開(kāi)始同時(shí)使用Cookie和URL回寫機(jī)制,如果發(fā)現(xiàn)客戶端支持Cookie,就繼續(xù)使用Cookie,停止使用URL回寫。如果發(fā)現(xiàn)Cookie被禁用,就一直使用URL回寫。jsp開(kāi)發(fā)處理到Session的時(shí)候,對(duì)頁(yè)面中的鏈接記得使用 response.encodeURL() 。
?
四、總結(jié)
回顧完Session和Cookie,那么問(wèn)題來(lái)了,為什么手機(jī)端與服務(wù)器交互沒(méi)有實(shí)現(xiàn)在同一session下?
1)原因很簡(jiǎn)單,就是因?yàn)閍ndroid手機(jī)端在訪問(wèn)web服務(wù)器時(shí),沒(méi)有給http請(qǐng)求頭部設(shè)置sessionID,而使用web瀏覽器作為客戶端訪問(wèn)服務(wù)器時(shí),在客戶端每次發(fā)起請(qǐng)求的時(shí)候,都會(huì)將交互中的sessionID:JSESSIONID設(shè)置在Cookie頭中攜帶過(guò)去,服務(wù)器根據(jù)這個(gè)sessionID獲取對(duì)應(yīng)的Session,而不是重新創(chuàng)建一個(gè)新Session(除了這個(gè)Session失效)。
以Java.NET.HttpURLConnection發(fā)起請(qǐng)求為例:
獲取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,是鍵值對(duì),不是單指值 發(fā)送設(shè)置cookie: URL url = new URL(requrl); HttpURLConnectioncon= (HttpURLConnection) url.openConnection(); if(sessionid != null) { con.setRequestProperty("cookie", sessionid); }
只要設(shè)置了sessionID,這樣web服務(wù)器在接受請(qǐng)求的時(shí)候就會(huì)自動(dòng)搜索對(duì)應(yīng)的session了,從而保證了在同一會(huì)話Session。
以下是我個(gè)人總結(jié)出來(lái)的Http請(qǐng)求的代碼:
private static String session_id = null;public static String httpRequest(String requrl) {String result = null;// 請(qǐng)求返回的字符串try {URL url = new URL(requrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");if (session_id != null) {con.setRequestProperty("Cookie", session_id);//設(shè)置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的開(kāi)發(fā)框架,那么在下一章Android OKHttp的使用心得中會(huì)有介紹遇到session過(guò)期問(wèn)題如何使用OKHttp保持session的會(huì)話
參考
http://blog.csdn.net/zxc123e/article/details/41698027
http://blog.csdn.net/yaochangliang159/article/details/50433682
總結(jié)
以上是生活随笔為你收集整理的Android客户端与服务器端交互,如何保持session回话的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android-support-v4 v
- 下一篇: Android OkHttp的使用心得