作者:軒轅志遠
鏈接:https://www.zhihu.com/question/19786827/answer/28752144
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權硝清,非商業(yè)轉載請注明出處。
由于HTTP協(xié)議是無狀態(tài)的協(xié)議转晰,所以服務端需要記錄用戶的狀態(tài)時芦拿,就需要用某種機制來識具體的用戶,這個機制就是Session.典型的場景比如購物車查邢,當你點擊下單按鈕時蔗崎,由于HTTP協(xié)議無狀態(tài),所以并不知道是哪個用戶操作的扰藕,所以服務端要為特定的用戶創(chuàng)建了特定的Session缓苛,用用于標識這個用戶,并且跟蹤用戶邓深,這樣才知道購物車里面有幾本書未桥。這個Session是保存在服務端的笔刹,有一個唯一標識。在服務端保存Session的方法很多冬耿,內存舌菜、數(shù)據(jù)庫、文件都有亦镶。集群的時候也要考慮Session的轉移日月,在大型的網站,一般會有專門的Session服務器集群缤骨,用來保存用戶會話山孔,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如Memcached之類的來放 Session荷憋。
思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了褐望。每次HTTP請求的時候勒庄,客戶端都會發(fā)送相應的Cookie信息到服務端。實際上大多數(shù)的應用都是用 Cookie 來實現(xiàn)Session跟蹤的瘫里,第一次創(chuàng)建Session的時候实蔽,服務端會在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個Session ID谨读,以后每次請求把這個會話ID發(fā)送到服務器局装,我就知道你是誰了。有人問劳殖,如果客戶端的瀏覽器禁用了 Cookie 怎么辦铐尚?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤哆姻,即每次HTTP交互宣增,URL后面都會被附加上一個諸如 sid=xxxxx 這樣的參數(shù),服務端據(jù)此來識別用戶矛缨。
Cookie其實還可以用在一些方便用戶的場景下爹脾,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了箕昭,怎么辦灵妨?這個信息可以寫到Cookie里面,訪問網站的時候落竹,網站頁面的腳本可以讀取這個信息泌霍,就自動幫你把用戶名給填了,能夠方便一下用戶述召。這也是Cookie名稱的由來烹吵,給用戶的一點甜頭碉熄。所以,總結一下:Session是在服務端保存的一個數(shù)據(jù)結構肋拔,用來跟蹤用戶的狀態(tài)锈津,這個數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫凉蜂、文件中琼梆;Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息窿吩,也是實現(xiàn)Session的一種方式茎杂。