Android HTTP session && cookie

來源:互聯網
上載者:User

標籤:

http://www.2cto.com/kf/201206/135471.html
HTTP協議與狀態保持

HTTP協議本身是無狀態的,這與HTTP協議本來的目的是相符的,用戶端只需要簡單的向伺服器請求下載某些檔案,無論是用戶端還是伺服器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關係一樣。
     
    然而聰明(或者貪心?)的人們很快發現如果能夠提供一些按需產生的動態資訊會使web變得更加有用,就像給有線電視加上點播功能一樣。這種需求一方面迫使HTML逐步添加了表單、指令碼、DOM等用戶端行為,另一方面在伺服器端則出現了CGI規範以響應用戶端的動態請求,作為傳輸載體的HTTP協議也添加了檔案上傳、cookie這些特性。其中cookie的作用就是為瞭解決HTTP協議無狀態的缺陷所作出的努力。至於後來出現的session機制則是又一種在用戶端與伺服器之間保持狀態的解決方案
     
    讓我們用幾個例子來描述一下cookie和session機制之間的區別與聯絡。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
    1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支援狀態。
    2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期間限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在用戶端保持狀態。
    3、發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄添加一些消費資訊。這種做法就是在伺服器端保持狀態。
     
    由於HTTP協議是無狀態的,而出於種種考慮也不希望使之成為有狀態的,因此,後面兩種方案就成為現實的選擇。具體來說cookie機制採用的是在用戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在用戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制來達到儲存標識的目的,但實際上它還有其他選擇。

http://www.blogjava.net/cheneyfree/archive/2007/05/26/120168.html

Cookie 定義
typedef struct CookieEntry
{
       PTCHAR     pszName;
       PTCHAR     pszValue;
       PTCHAR     pszUrlPath;
       DWORD      dwFlags;//Security Flags
       DWORD      dwLowWordExpiration;//LowWord of FILETIME
       DWORD      dwHighWordExpiration;//HighWord ofFILETIME
       DWORD      dwLowWordCreation;//LowWord of FILETIME
       DWORD      dwHighWordCreation;//HighWord of FILETIME
       CHAR   chEnd;//‘*‘
}COOKIEENTRY, *LPCOOKIEENTRY;

總結起來,每個Cookie有6個屬性,分別 為:Cookies Name; Cookies Value; Domain;Path; Secure; Expire Date。這裡給出的Cookie的6個屬性和C++中定義的結構體不完全一致。其原因將在Cookie的檔案格式小節給出解釋。
下面對Cookie結構中的各個屬性分別給出解釋:
Cookies Name <Key>, 必要屬性,指明了Cookie的名字,有一系列字元(不包括括弧、逗號、空格等)組成;每個cookie由一個唯一的名稱代表,這個名稱可以包含字母、數 字、底線。Cookie的名稱是不分大小寫,所以mycookie和MyCookie是一樣。但考慮到伺服器端語言可能區分大小寫,所以對程式開發人員來 說定義和使用時最好還是區分大小寫。
Cookies Value,<Value>Cookie 的值,Web伺服器儲存在Cookie中的資訊;儲存在Cookie中的字串值。這個值在儲存之前是用encodeURIComponent()對其進 行編碼的,否則會遺失資料或佔用了Cookie。而且Cookie名字和值加起來的位元組數不能超過4095位元組,也即4KB。
Domain, 可選,指明了Cookie的有效域的範圍,預設的是產生Cookie的伺服器的名字;出於安全考慮,網站不能訪問由其他域所建立的Cookie。建立 Cookie以後,域的資訊會作為cookie的一部分儲存下來。關於域,舉個例子來說,如http://www.baidu.com/view /index.html, 它的域為:baidu.com。這裡不做詳述,後面的章節會有所涉及。
Path, 可選,指明了Cookie在有效域中的有效路徑,在有效路徑外的網頁不可以讀寫Cookie,預設的是產生此Cookie的資訊的URL;而該屬性也是 Cookie的另一個安全特徵,限制對Web伺服器上特定目錄的訪問。即控制哪些訪問能觸發發送。例如請求的地址是上面的URL,如果 path=/view,這個Cookie就會被發送,但是path為其他路徑的話,該Cookie會被忽略。
Secure, 可選,一個true/false值,用於表示Cookie是否只能從安全網站(使用SSL和https協議的網站)中訪問;即如果標記一個Cookie為 安全的(這個值被設定為true),那麼僅當用戶端與伺服器的對話通道是安全的(如HTTP over SSL),Cookie才會被傳送。
Expire Date, 可選,指明了Cookie的有效時間,一旦到期,Cookie將不再有效,通常由產生Cookie的程式(Date由伺服器指明)指定,如果不指明,系統會預設Cookie將在使用者會話結束後自動到期。



cookie機制和session機制的區別
*************************************************************************************
Cookie是用戶端的儲存空間,由瀏覽器來維持。具體來說cookie機制採用的是在用戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於才伺服器端保持狀態的方案在用戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制("PHPSESSID")來達到儲存標識的目的,但實際上還有其他選擇,比如說重寫URL和隱藏表單域。
如何利用實現自動登入
*************************************************************************************
當使用者在某個網站註冊後,就會收到伺服器發送的一個惟一使用者ID的cookie。客戶後來重新串連時,這個使用者ID會自動發送回伺服器,伺服器對它進行檢查,確定它是否為註冊使用者且選擇了自動登入,從而使使用者務需給出明確的使用者名稱和密碼,就可以訪問伺服器上的資源。
如何根據使用者的愛好定製網站
*************************************************************************************
網站可以使用cookie記錄使用者的意願。對於簡單的設定,網站可以直接將頁面的設定儲存在cookie中完成定製。然而對於更複雜的定製,網站只需僅將一個惟一的標識符發送給使用者,由伺服器端的資料庫儲存每個標識符對應的版面設定。

通過Cookie實現Session保持
http://l62s.iteye.com/blog/1663113

點擊(此處)摺疊或開啟

  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.List;
  4. import org.apache.http.HttpEntity;
  5. import org.apache.http.HttpResponse;
  6. import org.apache.http.HttpStatus;
  7. import org.apache.http.NameValuePair;
  8. import org.apache.http.client.ClientProtocolException;
  9. import org.apache.http.client.CookieStore;
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;
  11. import org.apache.http.client.methods.HttpPost;
  12. import org.apache.http.cookie.Cookie;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import org.apache.http.protocol.HTTP;
  15. import org.apache.http.util.EntityUtils;
  16. public class MyHttpClient implements InetConfig {
  17. private DefaultHttpClient httpClient;
  18. private HttpPost httpPost;
  19. private HttpEntity httpEntity;
  20. private HttpResponse httpResponse;
  21. public static String PHPSESSID = null;
  22. public LVHttpClient() {
  23.     }
  24. public String executeRequest(String path, List<NameValuePair> params) {
  25.         String ret = "none";
  26.        try {
  27.             this.httpPost = new HttpPost(BASEPATH + path);
  28.             httpEntity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
  29.             httpPost.setEntity(httpEntity);
  30.              //第一次一般是還未被賦值,若有值則將SessionId發給伺服器
  31.             if(null != PHPSESSID){
  32.                 httpPost.setHeader("Cookie", "PHPSESSID=" + PHPSESSID);
  33.             } 
  34.             httpClient = new DefaultHttpClient();
  35.         } catch (UnsupportedEncodingException e) {
  36.             e.printStackTrace();
  37.         }
  38.         try {
  39.             httpResponse = httpClient.execute(httpPost);
  40.             if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  41.                 HttpEntity entity = httpResponse.getEntity();
  42.                 ret = EntityUtils.toString(entity);
  43.                 CookieStore mCookieStore = httpClient.getCookieStore();
  44.                 List<Cookie> cookies = mCookieStore.getCookies();
  45.                 for (int i = 0; i < cookies.size(); i++) {
  46.                      //這裡是讀取Cookie[‘PHPSESSID‘]的值存在靜態變數中,保證每次都是同一個值
  47.                      if ("PHPSESSID".equals(cookies.get(i).getName())) {
  48.                         PHPSESSID = cookies.get(i).getValue();
  49.                         break;
  50.                     }
  51.                 }
  52.             }
  53.         } catch (ClientProtocolException e) {
  54.             e.printStackTrace();
  55.         } catch (IOException e) {
  56.             e.printStackTrace();
  57.         }
  58.         return ret;
  59.     }
  60. }

基於http協議的,那麼如果網站不是php做的話,那個叫做Sessionid的Cookie可能叫做別的了,就不是PHPSESSID了,而是叫做別的名字了,這個可能要具體情況去查了。 

HTTP協議分析:
http://blog.csdn.net/gueter/article/details/1524447

Android HTTP session && cookie

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.