基本概念javascript
對於許多人來講,都知道的是,cookie是存儲在客戶端的,能夠用來放須要長期使用的內容,例如用戶密碼、用戶帳戶等等,服務器是能夠獲取到cookie的內容的;而session則是存儲在服務器端,經過惟一的session_id來區別用戶,用於保存用戶的登陸狀態和請求等,客戶是不能獲取到其內容的。php
這對於許多人來講都是比較基礎的內容,也是表現形式上的區別,在這裏咱們深刻的瞭解一下二者。html
爲何須要cookie?java
對於web程序,有一個須要考慮的問題是如何跟蹤用戶的會話,照常理來講,一個用戶的行爲只能對應於一個會話,好比開發購物車應用,就要考慮到用戶的購物車中的內容,一個用戶的購物車總不能裝的是別人的商品吧?跟蹤用戶的會話就是用來區分不一樣用戶的各自所挑選的商品。web
可是Web應用是基於HTTP協議來傳輸數據的,而HTTP協議是無狀態的,在完成傳輸數據以後,客戶端與服務器端的鏈接就會關閉,對於不一樣用戶發生「將商品放入購物車」的動做時,不可以判斷哪一件商品對應哪一位用戶。在這裏須要使用cookie,來解決HTTP協議在跟蹤會話上的不足。面試
cookie是服務器端給客戶端分發的一種憑證,客戶端要請求服務,就須要在發送數據時的同時發送cookie,服務器端經過識別cookie的內容,得知用戶的身份,就能夠知道用戶的購物車是那一輛,再將商品放進去就能夠了。瀏覽器
cookie的內容安全
要查看cookie能夠在地址欄輸入 javascript: alert(document.cookie); 就能夠看到網站分發的cookie了。下面是百度上的cookie內容,在有使用cookie的網站使用纔可行。服務器
cookie的內容就是這樣的字符串,服務器經過讀取這樣的長長的加密過的cookie來獲取用戶的信息,這裏有BAIDUID(即個人百度帳號),以及其餘的信息。cookie
cookie的分類
實際上cookie也分爲兩種,分別是停留在瀏覽器所佔內容的臨時性的cookie,在頁面窗口關閉以後就被刪除,被稱爲session cookie;而另一種是經過存放在硬盤空間中長期存在的cookie,這種cookie稱爲persistent cookie,也就是咱們一般意義上所講的cookie。
一般session是依賴於session cookie來與客戶端交互的,固然session的工做方式不只僅限於這一種,還有其餘的方式在下文會說到。
cookie的屬性
如下表格是cookie的比較經常使用的屬性及其說明:
屬性名 | 描述 |
String name | 該Cookie的名稱。Cookie一旦建立,名稱便不可更改 |
Object value | 該Cookie的值。若是值爲Unicode字符,須要爲字符編碼。若是值爲二進制數據,則須要使用BASE64編碼 |
int maxAge | 該Cookie失效的時間,單位秒。若是爲正數,則該Cookie在maxAge秒以後失效。若是爲負數,該Cookie爲臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。若是爲0,表示刪除該Cookie。默認爲–1 |
boolean secur | 該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網絡上傳輸數據以前先將數據加密。默認爲false |
String path | 該Cookie的使用路徑。若是設置爲「/sessionWeb/」,則只有contextPath爲「/sessionWeb」的程序能夠訪問該Cookie。若是設置爲「/」,則本域名下contextPath均可以訪問該Cookie。注意最後一個字符必須爲「/」 |
String domain | 能夠訪問該Cookie的域名。若是設置爲「.google.com」,則全部以「google.com」結尾的域名均可以訪問該Cookie。注意第一個字符必須爲「.」 |
要注意到cookie的名稱是沒法修改的,同時cookie並不提供修改和刪除的操做,若是說要修改cookie 的內容,則能夠新建一個同名的cookie覆蓋掉原來的便可;要刪除cookie的話則新建一個同名的cookie,並設置其maxAge爲0便可。
須要考慮cookie中maxAge的一些特殊值所表明的含義,若是maxAge爲負值,則表示cookie僅僅在當前瀏覽器窗口以及其打開的子窗口中有效,關閉時則失效,這也是cookie的默認maxAge值;若是maxAge爲0,則說明刪除該cookie,因爲並無刪除cookie的操做,這裏是須要經過cookie的maxAge來進行刪除操做的。
seesion的出現
對於cookie是存儲在客戶端的,這種存儲在客戶端的信息每每是不安全的,因此後來又有了session,客戶端瀏覽器向服務器發送請求的時候,服務器將客戶端的信息以某種形式存儲在服務器上,這種存儲在服務器端的信息在客戶第二次訪問服務器的時候被使用,用來肯定用戶的狀態等信息。打個比方而言,就至關於這是一張記錄客戶信息的表格,客戶只要代表身份,服務器就能從這個表格中來獲取客戶的信息,根據信息進行服務。
session的使用
服務器會在客戶端第一次請求服務的時候建立session對象,與cookie相似,session對象也是以鍵值對的形式存儲的。每一個session對象都有獨立的session_id,對於特定的客戶,就賦予特定的session,能夠區分不一樣的用戶。須要注意的是,一般是在用戶請求具體服務的時候纔會建立session,單純的訪問靜態的內容(如HTML)並不會建立session。而在建立以後的每一次客戶訪問服務器都會更新session的內容,好比session的最後訪問時間等等。
還有一點是session的內容應該儘可能的精簡,由於session是存儲在服務器端的,須要佔用到寶貴的服務器資源(通常放在服務器內存裏),因此這裏在有大量客戶訪問的時候,會致使服務器的資源不夠用。此外還會給session設置有效期,對於長時間沒有活躍的session會從內存中刪除,這也是咱們用一些Web應用時會有說「登陸超時」的狀況出現。
session的依賴實現
對於上面所說的session,它對於用戶來講是透明的,在客戶請求服務的時候,客戶端須要有一個標示本身身份的憑證,可是僅僅是標示本身的身份,因此這個標示會比較小。經過這個身份,服務器才能從內存中的多個session中知道用戶是對應於哪個session。
通常來講session是要依賴於cookie來實現,這一點在上面講到cookie的分類時說到,這時候生成的cookie就是上文提到的session cookie,而cookie的內容就是session的特定的id,這個cookie在瀏覽器關閉的時候就會失效。
所以同一個機器上的兩個瀏覽器窗口訪問服務器的時候會生成兩個不一樣的session。可是若是兩個窗口是由同一個父窗口打開的話,子窗口會共享父窗口的cookie,因此這時候是共享一個session。
若是禁用了cookie,那要怎麼實現session?
這個問題有時候會在面試的時候問到,在瀏覽器禁用cookie或者不支持cookie的時候,一般會採起一種叫作「URL重寫」的方式來實現session,也就是以相似於GET方式,將session_id寫在URL的後面,這樣服務器也能獲取到客戶的session_id,經過這個獨立的id就能識別特定的用戶了。
參考資料: Cookie/Session機制詳解 做者:fangaoxin
老生常談session,cookie的區別,安全性 做者:海底蒼鷹