對session和cookie的整理

cookie

1、什麼是cookie

是指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。

Cookie是由服務端生成的,發送給客戶端(通常是瀏覽器)的。Cookie總是保存在客戶端中。

2、爲什麼要使用cookie?

這是因爲http是無狀態的,兩次請求間,服務器不知道用戶上一次執行了什麼操作,這嚴重的阻礙了交互式web應用程序的實現。服務器可以通過設置或者讀取cookie中存儲的信息,藉此維護用戶和服務器會話中的狀態

3、cookie有哪些優點

cookie機制將信息存儲於用戶硬盤,因此可以作爲跨頁面全局變量

4、cookie有哪些缺陷

  • cookie的安全性不夠高
    cookie的信息是存儲在瀏覽器中的,所以容易被篡改,因此我們不會將很重要的信息存儲在cookie中
  • cookie可能被禁用
  • cookie可能被用戶刪除
  • cookie的存儲空間很小(只有4kb左右)
    cookie由於每次請求都要向後臺發送數據,所以容量要有限制,否則會大大降低網絡傳輸效率。
  • cookie會被附加在每個HTTP請求中,所以無形中增加了流量。

5、一般在什麼場合使用cookie

  • 保持用戶的登陸狀態
  • 跟蹤用戶的行爲,比如記錄用戶瀏覽數據,進行商品(廣告)推薦
  • 創建購物車

6、如何使用cookie

  1. 服務器端給客戶端發送cookie
const express = require('express');
var server = express();
server.use('/aaa/a.html',function(req,res){//只能對aaa目錄下的a.html起作用
    res.cookie('user','blue',{
    path:'/aaa',//cookie存儲的路徑,匹配該路徑才發送這個 cookie。
    maxAge:30*24*3600*1000//以毫秒爲單位,表示過期時間
    });
    res.send('ok');
});
server.listen(8080);

在這裏插入圖片描述

  1. 使用cookie-parser中間件讀取cookie
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);
app.use(cookieParser('aass'));
//這裏要注意的是,我們之前在/aaa中請求了cookie,而我們在/中能讀取到,是因爲cookie是向上級讀取的
app.get('/',function (req,res) {   
	 res.secret='aass';    
	 res.cookie('name','GeZi',{        
	 	path:'/',//訪問哪一個路徑的時加上cookie        
	 	maxAge:20*60*1000,//cookie的存活時間,單位毫秒        
	 	signed:true//是否加簽名
	 });  
	 console.log('沒有簽名的cookie:',req.cookies);    
	 console.log('簽名後的cookie:',req.signedCookies);    
	 res.send(req.cookies);
});
  1. 清除cookie
res.clearCookie('name')

session

什麼是session

Session代表服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。Session是一種服務器端的機制,Session 對象用來存儲特定用戶會話所需的信息。

Session由服務端生成,保存在服務器的內存、緩存、硬盤或數據庫中。

爲什麼要使用session

  • cookie不夠安全
    cookie是保存在客戶端的數據,容易被篡改,session保存在服務器端,不會被篡改。
  • cookie可以存儲的內容太少了
    session

那麼問題來了,既然cookie相對於session有那麼大的不足,爲什麼還需要cookie呢?

因爲session是基於cookie實現的,當建立一個新session的時候,向客戶端下發一個session-id,讓客戶端保存session-id在cookie中,下一次發起請求的時候,將session-id發回後臺,後臺通過session-id,在很多session中查找到相應session-id對應的session進行操作。

一般在什麼場合使用session

  • 會話管理 登錄,購物車,遊戲分數或服務器應記住的任何其他內容
  • 個性化用戶首選項,主題和其他設置
  • 跟蹤記錄和分析用戶行爲

如何使用session

這裏用到cookie-session中間件

const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSeesion = require('cookie-session');
var server = express();
server.listen(8080);

server.use(cookieParser('這段簽名的字符串可以是隨意的'));
(function () {    
	var arr = [];    
	for(var i = 0;i<10000;i++){    
	    arr.push('keys_'+Math.random());   
 	}
 	server.use(cookieSeesion({    
 	    keys:arr,        
 	    name:'session_id',//加密的cookie的名字,最後通過這個來從服務端查找到對應的人        				    maxAge:20*60*1000    
 	    }))
})();

server.get('/',function (req,res) {  
	  console.log(req.session['test']);    
	  if(typeof req.session['test'] == 'undefined'){    
	      req.session['test'] = 'xixi';        
	      res.send('這是第一次訪問');   
	  }else{    
	      res.send('這不是第一次訪問'); 
}});

cookie和session的區別

  1. 存放位置不同
    Cookie保存在客戶端,Session保存在服務端。

  2. 存取方式的不同
    Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進制數據,需求先進行編碼。Cookie中也不能直接存取Java對象。若要存儲略微複雜的信息,運用Cookie是比擬艱難的。
    而Session中能夠存取任何類型的數據,包括而不限於String、Integer、List、Map等。Session中也能夠直接保管Java Bean乃至任何Java類,對象等,運用起來十分便當。能夠把Session看做是一個Java容器類。

  3. 安全性(隱私策略)的不同
    Cookie存儲在瀏覽器中,對客戶端是可見的,客戶端的一些程序可能會窺探、複製以至修正Cookie中的內容。而Session存儲在服務器上,對客戶端是透明的,不存在敏感信息泄露的風險。 假如選用Cookie,比較好的方法是,敏感的信息如賬號密碼等儘量不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務器後再進行解密,保證Cookie中的信息只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在服務器上,Session裏任何隱私都能夠有效的保護。

  4. 有效期上的不同
    只需要設置Cookie的過期時間屬性爲一個很大很大的數字,Cookie就可以在瀏覽器保存很長時間。 由於Session依賴於名爲JSESSIONID的Cookie,而Cookie JSESSIONID的過期時間默許爲–1,只需關閉了瀏覽器(一次會話結束),該Session就會失效。

  5. 跨域支持上的不同
    Cookie支持跨域名訪問,例如將domain屬性設置爲“.baidu.com”,則以“.baidu.com”爲後綴的一切域名均能夠訪問該Cookie。跨域名Cookie如今被普遍用在網絡中。而Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。

  6. 對服務器造成的壓力不同
    Session是保管在服務器端的,每個用戶都會產生一個Session。假如併發訪問的用戶十分多,會產生十分多的Session,耗費大量的內存。而Cookie保管在客戶端,不佔用服務器資源。假如併發閱讀的用戶十分多,Cookie是很好的選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章