無狀態(tài)的http
我們都知道http的請求和響應式相互獨立的,服務器無法識別兩條http請求是否是同一個用戶發(fā)送的。也就是說服務器端并沒有記錄通信狀態(tài)的能力。我們通常使用cookie和session來確定會話雙方的身份。
cookie
cookie 是從服務器端發(fā)送的,服務器給不同的用戶發(fā)送不同的標識,這個標識表示用戶的身份,服務器通過客戶端發(fā)送的這個標識來識別用戶的身份,從而查詢服務器中的該用戶的相關(guān)數(shù)據(jù),然后發(fā)送到該用戶。
安裝express提供的cookie-parser中間件:
npm i -S cookie-parser
在我們使用的項目頁面模塊中引入 cookie-parser 插件,然后實例化它,如下:
var cookieParser = require('cookie-parser');var cp = cookieParser(secret, options);它有兩個參數(shù),第一個參數(shù)secret,用它可以對cookie進行簽名,也就是我們常說的cookie加密。它可以是字符串也可以是數(shù)組,如果熟悉加密原理的同學應該知道,這個字符串就是服務器所擁有的密文,第二個參數(shù)options包含如下可選參數(shù):
參考cookie-parser中的例子,實現(xiàn)一個記住訪問路徑的demo,代碼如下:
var path = require('path');var express = require('express');var cookieParser = require('cookie-parser');var app = express();// 使用 cookieParser 中間件;app.use(cookieParser());// 如果請求中的 cookie 存在 isFirst// 否則,設(shè)置 cookie 字段 isFirst, 并設(shè)置過期時間為10秒app.get('/', function(req, res) { if (req.cookies.isFirst) { res.send("再次歡迎訪問"); console.log(req.cookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000}); res.send("歡迎第一次訪問"); }});app.listen(3030, function() { console.log('express start on: ' + 3030)});cookie-parser 還可以對Cookie數(shù)據(jù)進行加密,也就是我們所說的signedCookies。
signedCookies
實現(xiàn)代碼如下:
var path = require('path');var express = require('express');var cookieParser = require('cookie-parser');var app = express();// 使用 cookieParser 中間件;app.use(cookieParser('my_cookie_secret'));// cookieapp.get('/', function(req, res) { if (req.signedCookies.isFirst) { res.send("歡迎再一次訪問"); console.log(req.signedCookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000, signed: true}); res.send("歡迎第一次訪問"); }});從上面的代碼中我們知道cooke-parser的第一個參數(shù)可以指定服務器端的提供的加密密匙,然后我們使用options中的signed配置項可實現(xiàn)加密。雖然這樣相對安全,但是客戶端的Cookie有局限性,在客戶端發(fā)送請求時會增加請求頭部的數(shù)據(jù)量,導致請求速度變慢;另外它不能實現(xiàn)數(shù)據(jù)的共享。
新聞熱點
疑難解答
圖片精選