再說Cookie與Session以前,先要了解一下http協議。web
http協議即超文本傳輸協議,一種基於瀏覽器請求與服務器響應的協議,該協議主要的特色就是它是一種無狀態的協議(只針對cookie與session問題),在客戶端連續向服務器發送請求的時候,每次請求的過程當中只要數據交換完畢,服務器與客戶端就會斷開鏈接,再次請求的時候會從新鏈接客戶端與服務器,這樣服務器記錄上次的對話,那麼問題來了,如何讓服務器知道是哪一個客戶端向本身發出的請求呢,這個時候cookie就誕生了~編程
cookie是一小段文本信息,這段小文本信息由服務器首次響應客戶端時發送的,在客戶端向服務器首次發送請求的時候,服務器會判斷是否要記錄客戶端的身份,若是須要,此時就會在響應中(response)給客戶端發送一個cookie,該cookie文本信息保存在http的報頭裏,當瀏覽器會將cookie保存起來,當該瀏覽器再次發送請求時會攜帶cookie,服務器檢查cookie來識別瀏覽器請求。跨域
cookie有一些特色:瀏覽器
- cookie是能夠被瀏覽器禁止的,並且不一樣的瀏覽器對cookie的保存方式也不同;
- cookie對象是以鍵值對的形式純在的;
- cookie是不能夠跨域的;同一個瀏覽器訪問一次百度(百度給瀏覽器頒發一個cookie),訪問一次騰訊(騰訊給瀏覽器頒發一個cookie),因爲cookie是瀏覽器管理的,因此瀏覽器會根據域名來判斷是否能夠操做cookie。總而言之,百度的請求時不可能攜帶騰訊頒發的cookie,反之依然成立。
- cookie是有生命週期的;
- cookie是不安全的;這麼說並不許確,只是針對某些狀況來講是不安全的。因爲http協議自己不具備安全性,在傳輸協議的過程當中是能夠被截獲的,因此cookie通常只會在https等安全協議中傳輸。
session本省並不存在,只是一個概念,session是服務器用來記錄客戶端狀態的機制,不一樣於cookie保存在瀏覽器中,session是保存在服務器上的,服務器會根據cookie生成一個session id存在服務器上,當請求再次抵達服務器時,服務器發出響應時會將session id 存在cookie內一同反回給瀏覽器,這就是session。session以鍵值對的形式保存。安全
session的一些特色:服務器
- session的機制決定了當前用戶只能獲取到本身的session,各個session是獨立的,不可見的;
- session是有生命週期的,Session保存在服務器端。Session保存在服務器端。爲了得到更高的存取速度,服務器通常把Session放在內存裏。每一個用戶都會有一個獨立的Session。若是Session內容過於複雜,當大量客戶訪問服務器時可能會致使內存溢出。所以,Session裏的信息應該儘可能精簡。Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session,用戶每訪問一次服務器,服務器就會認爲該用戶session活躍了一次。
- session的有效期;爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。若是超過了超時時間沒訪問過服務器,Session就自動失效了。
- session對瀏覽器的需求,session是存在服務器中的,可是對客戶端是透明的,session的運行是須要客戶端瀏覽器的支持,session須要使用cookie做爲標識。http協議自己是無狀態的協議,session不能根據每一次的請求判斷客戶端,session須要使用cookie做爲標識,因此服務器向客戶端瀏覽器發送一個Jsessionid的Cookie,它的值爲session id,session會根據cookie的值即session id來判斷是否爲同一個客戶端。那麼問題來了,若是cookie被瀏覽器禁止了,這樣session機制就很差使了嗎,不是這樣的,獲取session id的方式還能夠經過Hidden Form跟URL,也就是對於一個已經啓用了session機制的系統來講,咱們惟一的目的就是讓http這個無狀態的協議編程模擬成有狀態(websocket長鏈接就不說了),只要能每一次的請求讓服務器獲取到session id就達到目的了。
終結:cookie與session是有區別的,由於cookie是保存在客戶端瀏覽器中的,而session是保存在服務器中的,可是在session機制以cookie做爲標識的場景下cookie與session又沒有區別,由於不管使用cookie機制仍是session機制,本質上都是經過cookie機制來使服務器 來識別客戶端瀏覽器的。websocket
dqhan cookie
2017.1.3session