Node.js簡單使用cookie,幫助理解實現原理和交互過程

HTTP是一個無狀態的協議,而現實中的業務是需要一定狀態的,否則無法區分用戶的身份。通過使用Cookie能幫助我們標識不同身份的用戶。可用於記錄服務器於客戶端之間的狀態,最早的用處是用於判斷用戶是否第一次登陸,如下面部分的代碼。

Cookie的處理分爲:

  • 服務器向客戶端發送Cookie
  • 瀏覽器保存Cookie
  • 之後瀏覽器的每次請求都會將Cookie發給服務器端。

服務器響應的Cookie值在Set-Cookie中,最後將Set-Cookie設置在響應報文頭部中返回,格式與請求中的格式不太一樣,請求的cookie爲對象:

Set-Cookie: name=value; Path=/; Expires=Sun, 23-Apr-23 09:01:35 GMT; Domain=.domain.com;

服務端:

var http = require('http');

http.createServer(function (req, res) {
	req.cookies = parseCookie(req.headers.cookie);	//解析客戶端的cookie,,暫存在req.cookies上
	handle(req, res); //進一步業務處理
}).listen(8888);

//解析客戶端傳來的cookie
var parseCookie = function(cookie) {
	var cookies = {};
	if(!cookie) { //爲空,返回cookies
		return cookies;
	}
	//存在cookie,則解析客戶端的cookie,存儲於cookies給服務端使用
	var list = cookie.split(';'); //將Cookie值:key1=value; key2=value2轉變爲數組的形式
	for(var i = 0; i < list.length; i++) {  
		var pair = list[i].split('=');
		cookies[pair[0].trim()] = pair[1].trim(); //trim用於刪除字符串頭尾的空格
	}
	return cookies; //以數組形式返回
}

//業務處理
var handle = function(req, res) {
	if(!req.cookies.isVisit) {
		res.setHeader('Set-Cookie', serialize('isVisit', '1'));  //設置
		res.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
		res.write('<h1>第一次登陸</h1>');
		res.end();
	}
	else {
		res.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
		res.write('<h1>歡迎再次登陸</h1>');
		res.end();
	}
}

//格式化將返回的cookie
var serialize = function (name, val, opt) {
	var pairs = [name + '=' + encodeURIComponent(val)];
	opt = opt || {};

	if(opt.path) pair.push('Path=' + opt.path);	//還可以設置其他選項Domain、Expires等
	return pairs.join(';');  //將數組拼接成用分號連接的字符串
}

通過console.log(res); 會發現此時的服務器端響應報頭加上了Set-Cookie。而之後沒通過setHeader設置的Set-Cookie響應報頭,是不會再出現Set-Cookie的,爲null。
在這裏插入圖片描述 在這裏插入圖片描述
客戶端通過控制檯輸入,document.cookie查看:
在這裏插入圖片描述
客戶端收到帶Set-Cookie的響應後,在之後的請求時會在Cookie字段中帶上這個值。
在這裏插入圖片描述
Set-Cookie在報頭中可能存在多個字段。因此res.setHeader的第二個參數可以是一個數組:

res.setHeader('Set-Cookie', [serialize('foo', 'bar'), serialize('baz', 'val')]);

最後生成兩條Set-Cookie字段:

Set-Cookie: foo=bar; Path=/; Expires=Sun, 23-Apr-23 09:01:35 GMT; Domain=.domain.com; 
Set-Cookie: baz=val; Path=/; Expires=Sun, 23-Apr-23 09:01:35 GMT; Domain=.domain.com;

《深入淺出Node.js》

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