###1.cookie
含義: 存儲在訪問者的計算機中的變量,即存儲在客戶端
創建一個cookie
/* getCookie方法判斷document.cookie對象中是否存有cookie,若有則判斷該cookie中是否含有指定c_name的cookie,有則返回數據 沒有則返回空串 */
function getCookie(c_name){
if (document.cookie.length>0){
c_start=document.cookie.indexOf(c_name + "=") // indexOf() 返回指定字符串值在某個字符串中首次出現的位置,如果沒有出現則返回-1
if (c_start!=-1){
c_start=c_start + c_name.length+1 // 0 + 8 + 1 即username= 之后的位置 9
c_end=document.cookie.indexOf(";",c_start)
if (c_end==-1) c_end=document.cookie.length
return unescape(document.cookie.substring(c_start,c_end)) // subtring(start,stop)用於提取字符串中介於兩個指定下標的字符 start必填,stop可選 參數都為非負整數
// unescape() 對 escape() 編碼的字符串進行解碼。

}
}
return ""
}
/* setCookie方法將cookie名稱為c_name的value值存入document.cookie對象中 */
function setCookie(c_name,value,expiredays){
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value) + ((expiredays==null) ? "" : "; expires="+exdate.toGMTString()) //結果為: username= xxx;expires=xxx;
// toGMTString()方法,根據格林威治時間 (GMT) 把 Date 對象轉換為字符串,並返回結果。
// escape(string) 函數可對字符串進行編碼,就可以在所有計算機上讀取該字符串。
}
/* checkCookie()方法調用getCookie()判斷document.cookie對象中名稱為username的cookie是否已經設置,若已經設置則顯示提示框顯示信息,反之調用setCookie()方法設置cookie */
function checkCookie(){
username=getCookie('username')
if (username!=null && username!=""){alert('歡迎登陸 '+username+'!')}
else {
username=prompt('輸入用戶名:',"")
if (username!=null && username!=""){
setCookie('username',username,365)
}
}
}
附加: 刪除cookie 將expires設置為過期時間即可 cookie名稱可為空
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
###2.session
session依賴於cookie,它存儲在服務器端
session相當於程序在服務器上建立的一份用戶的檔案,用戶來訪的時候只需要查詢用戶檔案表就可以了。
HTTP協議是無狀態的,session不能依據HTTP連接來判斷是否為同一客戶,因此服務器向客戶端瀏覽器發送一個名為SESSIONID的cookie,它的值為該Session的id。Session依據該cookie來識別是否為同一用戶。
應用場景
- 通過session累計用戶數據。例如,一個未登錄用戶訪問了京東網站,這個時候京東對其下發了一個 cookie,假設cookie的名字叫做abc,那這條記錄就是 abc=001,同時京東的后台也生成了一個 session id, 它的值也為 001, 001 這個客戶在 2 點、 3 點、 4 點分別添加了三件商品到購物車,這樣后台也記錄了 session id 為 001的用戶的購物車里面已經有三件商品,並且只要每次客戶端 cookie 帶上來的值里面包含session id,后台都能夠展示相應的數據,如果這個時候,在瀏覽器里面清空 cookie,cookie 數據消失之后,后台和客戶端無法建立對應關系,購物車的數據就會失效了。
- 通過session實現單點登錄。一個用戶帳號成功登錄后,在該次session還未失效之前,不能在其他機器上登錄同一個帳號。登錄后將用戶信息保存到session中,如果此時在另外一台機器上一個相同的帳號請求登錄,通過遍歷(遍歷的意思就是將所有session都查看一遍)Web服務器中所有session並判斷其中是否包含同樣的用戶信息,如果有,在另一台機器上是不能登錄該帳號的。
###3.Cookie和Session區別
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮*到安全應當使用session
3、session會在一定時間內保存在服務器上,當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器性能方面,應當使用cookie
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie
5、建議將登錄信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中
6、session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器能夠知道其中的信息
7、session中保存的是對象,cookie中保存的是字符串
8、session不能區分路徑,同一個用戶在訪問一個網站期間,所有的session在任何一個地方都可以訪問到,而cookie中如果設置了路徑參數,那么同一個網站中不同路徑下的cookie互相是訪問不到的
###4.sessionStorage、localStorage和cookie的區別
共同點:都是保存在瀏覽器端、且同源的
區別:
1、cookie數據始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和服務器間來回傳遞,而sessionStorage和localStorage不會自動把數據發送給服務器,僅在本地保存。cookie數據還有路徑(path)的概念,可以限制cookie只屬於某個路徑下
2、存儲大小限制也不同,cookie數據不能超過4K,同時因為每次http請求都會攜帶cookie、所以cookie只適合保存很小的數據,如會話標識。sessionStorage和localStorage雖然也有存儲大小的限制,但比cookie大得多,可以達到5M或更大
3、數據有效期不同,sessionStorage:僅在當前瀏覽器窗口關閉之前有效;localStorage:始終有效,窗口或瀏覽器關閉也一直保存,因此用作持久數據;cookie:只在設置的cookie過期時間之前有效,即使窗口關閉或瀏覽器關閉
4、作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個頁面;localstorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的
