HTTP協議自己是無狀態的,這與HTTP協議原本的目的是相符的,客戶端只須要簡單的向服務器請求下載某些文件,不管是客戶端仍是服務器都沒有必要紀錄彼此過去的行爲,每一次請求之間都是獨立的,比如一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關係同樣。 html
然而聰明的人們很快發現若是可以提供一些按需生成的動態信息會使web變得更加有用,就像給有線電視加上點播功能同樣。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行爲,另外一方面在服務器端則出現了CGI規範以響應客戶端的動態請求,做爲傳輸載體的HTTP協議也添加了文件上載、cookie這些特性。其中cookie的做用就是爲了解決HTTP協議無狀態的缺陷所做出的努力。至於後來出現的session機制則是又一種在客戶端與服務器之間保持狀態的解決方案。 web
Cookies是做爲HTTP傳輸的頭信息的一部分發給客戶機的,因此向客戶機發送Cookies的代碼通常放在發送給瀏覽器的HTML文件的標記以前。數據庫
正統的cookie分發是經過擴展HTTP協議來實現的,服務器經過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也能夠生成cookie。 瀏覽器
而cookie的使用是由瀏覽器按照必定的原則在後臺自動發送給服務器的。瀏覽器檢查全部存儲的cookie,若是某個cookie所聲明的做用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。緩存
因爲Cookies的信息並不都是以文件形式存放在計算機裏,還有部分信息保存在內存裏。好比你在瀏覽網站的時候,Web服務器會自動在內存中生成Cookie,當你關閉IE瀏覽器的時候又自動把Cookie刪除安全
默認狀況下,若是在某個頁面建立了一個cookie,那麼該頁面所在目錄中的其餘頁面也能夠訪問該cookie。若是這個目錄下還有子目錄,則在子目錄中也能夠訪問。服務器
例如在www.xxxx.com/html/a.html中所建立的cookie,能夠被www.xxxx.com/html/b.html或www.xxx.com/ html/some/c.html所訪問,但不能被www.xxxx.com/d.html訪問。 cookie
語法以下: document.cookie="name=value; path=cookieDir"; 其中cookieDir表示可訪問cookie的目錄。session
例如: document.cookie="userId=320; path=/shop"; 就表示當前cookie僅能在shop目錄下使用。 若是要使cookie在整個網站下可用,能夠將cookie_dir指定爲根目錄,例如: document.cookie="userId=320; path=/"; 數據結構
(一):判斷用戶是否登錄過網站,以便下次登陸時可以直接登陸。若是咱們刪除cookie,則每次登陸必須重新填寫登陸的相關信息。
(二):另外一個重要的應用是「購物車」中類的處理和設計。用戶可能在一段時間內在同一家網站的不一樣頁面選擇不一樣的商品,能夠將這些信息都寫入cookie,在最後付款時從cookie中提取這些信息,固然這裏面有了安全和性能問題須要咱們考慮了。
因爲HTTP協議是無狀態的協議,因此服務端須要記錄用戶的狀態時,就須要用某種機制來識具體的用戶,這個機制就是Session.典型的場景好比購物車,當你點擊下單按鈕時,因爲HTTP協議無狀態,因此並不知道是哪一個用戶操做的,因此服務端要爲特定的用戶建立了特定的Session,用用於標識這個用戶,而且跟蹤用戶,這樣才知道購物車裏面有幾本書。這個Session是保存在服務端的,有一個惟一標識。在服務端保存Session的方法不少,內存、數據庫、文件都有。集羣的時候也要考慮Session的轉移,在大型的網站,通常會有專門的Session服務器集羣,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務好比Memcached之類的來放 Session。
思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次建立Session的時候,服務端會在HTTP協議中告訴客戶端,須要在 Cookie 裏面記錄一個Session ID,之後每次請求把這個會話ID發送到服務器,我就知道你是誰了。有人問,若是客戶端的瀏覽器禁用了 Cookie 怎麼辦?通常這種狀況下,會使用一種叫作URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用戶。
Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據能夠保存在集羣、數據庫、文件中;Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。