做Android程序員,了解服務器的知識是相當重要的,比如cookie和session。
首先介紹一點背景知識,我們知道HTTP的連接是無狀態的,HTTPS只是增加了安全,有了SSL證書來驗證,作為服務器怎么通過HTTP來知道客戶端的狀態呢?
比如如何識別來訪問的每個連接都是哪個客戶發起的連接,只憑字段或許可以知道是哪個瀏覽器平台,但是區別每個用戶是不可以的,當初設計瀏覽器的公司netscape就開發出了一種機制,名叫cookie,用cookie來記錄唯一的客戶。在cookie上面給每個到來的連接標上一個唯一的識別id,如果發現有了id,就針對進行操作,各種交互和用戶友好性行為。cookie是存儲在瀏覽器端的,由瀏覽器的W3C標准來保持,每次都是由服務器的response流addCookie然后到客戶端,由瀏覽器去判斷cookie的一些字段來進行對應的處理,比如是序列化還是存儲在內存,如果存儲在內存,那么當關閉瀏覽器cookie就消失了,有點類似於隱私模式。cookie可能有這么些字段,MaxAge:-1表示內存的時間,0表示清除cookie,整數表示多少時間(通常單位為second秒)。有些網站還會把用戶的id和密鑰放在cookie中,不過現在的密鑰一般都會進行加密才寫入到cookie中,服務器訪問的時候也會進行解密,id也會進行加密,比如百度的就加密了。我們可以用js的語法查看cookie。
javascript:{cStr=document.cookie;alert(cStr);} 或者簡單地寫alert(document.cookie)
Hm_lpvt_6859ce5aaf00fb00387e6434e4fcc925=1448292821; Hm_lvt_6859ce5aaf00fb00387e6434e4fcc925=1448206648,1448210112,1448292821,1448292821; IK_4A9653CF7DB7ACF29B1600233C8E8039=5; IK_CID_1=1; IK_CID_74=1; IK_CID_83=1; IK_CID_84=1; IK_CID_95=1; BAIDUID=4A9653CF7DB7ACF29B1600233C8E8039:FG=1; BIDUPSID=CFBBD1FD07741EDF61F7570768B3694D; H_PS_PSSID=17518_1421_18155_17949_17971_18042_15208_11816_18087_10633; MCITY=-%3A; PSTM=1447961566
以上是獲取的我地百度上面的cookie,畢竟客戶端的東西還是可以用js來操作的。
W3C的標准保證了不會有跨域讀取cookie,這里面我們想當然的會有一個鑽漏洞的想法,既然服務器可以讀取cookie,那么服務器可以不讀取自己的,讀取用戶訪問過得,那不是泄露了用戶隱私嗎?其實只要用戶使用了W3C標准的瀏覽器,那么瀏覽器就會保證不會把不屬於該域名的cookie傳遞給不相關域名的服務器。
session是服務器端的一種保存機制,在服務器端的內存中加載一些用戶的信息,儲存在數據庫中,不過一旦並發連接數多了,那么對於服務器的負擔將是比較重的。
對於客戶端還是需要一個cookie,cookie里面有一個叫做jsessionid的東西,這個用來和服務器的一一對應,客戶端記錄的信息比較少。不過對於用戶來講,可以禁用cookie,這時候怎么做呢,選擇在url地址上面做手腳,可以在url地址上面帶入一些id記錄信息什么的,這種參數是不影響客戶訪問瀏覽器的具體資源的,關鍵是服務器端要做好相應地記錄。
重點來了,如果是APP端,應該怎么做呢?APP端怎么去使用cookie,沒錯,java中有相關cookie的類,在這里面進行cookie的接受和處理。代碼待編輯---