session
- .由于http協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用有種機制來識別具體的用戶,這個機制就是session。
1.典型的場景比如購物車,當你點擊下單按鈕時,由于http協議無狀態,它并不知道是哪一個用戶操作的,所以服務端為特定的用戶創建特定的session,用于標識這個用戶,并且跟蹤用戶,這樣才知道購物車里面的內容,這個session是保存在服務端的,有唯一的標識。 - .在服務端保存的session的方法很多,內存、數據庫、文件都可以,集群的時候也要考慮session的轉移,在大型的網站,一般會有專門的session服務器集群,用來保存用戶會話,這個時候的session信息都是放在內存的,使用一些緩存服務比如Memcached之類來放session。
session創建于服務器端,保存于服務器,維護于服務器,每創建一個新的session,服務器端都會分配一個唯一ID,并且把這個ID保存到客戶端的Cookie中,保存的形式是以JSESSIONID來保存的。
cookie
服務器端是如何識別特定的客戶端呢?
- .Cookie登場,每次http請求的時候,客戶端都會發送相應的cookie信息到服務端。實際上大多數的應用都是用cookie來實現session的跟蹤,第一次創建session的時候,服務端會在http協議中告訴客戶端,需要在cookie里面記錄一個session ID,以后每次請求都會把這個ID發送到服務器,此時就知道對方的身份
有人問,如果客戶端的瀏覽器禁用來cookie怎么辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行回話更總,既每次http交互,URL后面都會被附加上一個諸如sid=xxxx這樣的參數,服務端據此來識別用戶 - .cookie是瀏覽器保存信息的一種方式,可以理解為一個文件,保存在客戶端,服務器可以通過響應瀏覽器的set-cookie的標頭,設置cookie的信息,保存在客戶端,你可以給這個文件設置一個期限,這個期限,不會因為瀏覽器的關閉而消失,其實大家應該對這個效果并不陌生,很多網購的網站都是這樣做的,即使你沒有買東西,它也會記住的喜好,會優先推薦你喜歡的東西
- .cookie其實還可以在一些方便用戶的場景下,設想你登錄過一個網站,下次登陸的時候不想在輸入帳號了,怎么辦?這個信息可以寫在cookie中,訪問網站的時候,網站頁面的腳本可以讀取這個信息,自動幫你把用戶名給填寫,能夠方便用戶,這個也是cookie的由來,但也因此cookie存在一定的安全隱患
總結
- .seesion是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中
- .cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現session的一種方式