express.cookieParser express.session区别
app.use(express.cookieParser({secret :‘123123123123123’})); app.use(express.session({secret :‘123123123123123’}));
请问这两有什么区别?secret 是什么东西?谢谢
3 回复
加密的密钥
当我们向浏览器发送cookie的时候,会调用cookieParser里面的secret来加密。 如果cookieParser设置了secret,session那边可以不用设置。
cookieParser的secret是用来加密nodejs往浏览器端发送的cookie。 session的secret是用来加密会话cookie的。 两者可以不一样,也可以一样。
如果有错,欢迎指正~~
@haiyang5253 我的理解, cookieParser是解析客户端请求时一并发送的cookie,并设置请求对象(req)的cookies、signedCookies属性:
module.exports = function cookieParser(secret, opt){
return function cookieParser(req, res, next) {
if (req.cookies) return next(); // 如果已经设置了cookies属性,跳过本middleware
var cookies = req.headers.cookie;
req.secret = secret;
req.cookies = {};
req.signedCookies = {};
if (cookies) {
try {
req.cookies = cookie.parse(cookies, opt); // 分析cookies
if (secret) { // 如果cookies是加密的
req.signedCookies = parse.signedCookies(req.cookies, secret); // 解析加密的cookies
req.signedCookies = parse.JSONCookies(req.signedCookies); // 并转为对象
}
req.cookies = parse.JSONCookies(req.cookies); // req.cookies现在是一个对象(key-value)
} catch (err) {
err.status = 400;
return next(err);
}
}
next();
};
};
session中间价则会加密sessionID(如果设置了secret的话),并发送相应的cookie给客户端:
var val = 's:' + signature.sign(req.sessionID, secret);
debug('set-cookie %s', val);
res.cookie(name, val, cookie.data);
writeHead.apply(res, arguments);
ps: 看的是比较新的代码(cookie-parser模块、express-session模块),不清楚老的express是如何实现的(猜测新版本功能不变,只是拆成了若干模块)。