Express框架 cookie session
cookie大小有限制,并且每次浏览器请求都会将cookie发送给服务器,为此,服务器本身有一个session存储,这个session可以理解为无限大小,只要服务器有空间,就可以存。
基本流程:
浏览器发出请求(空的cookie)
|
|
|
服务器接收,创建session,返回一个带session id的cookie给浏览器
|
|
|
浏览器接收到cookie,每次都会发送这个带id的cookie从而形成用户认证这种效果
session基于cookie
cookie
服务器发送cookie
const express = require("express");
var server = express();
server.listen(8080);
server.use('/', (req, res) => {
res.cookie('user', 'zhangsan', { path: "/", maxAge: 30 * 24 * 3600 * 1000 });
res.send("ok");
});
res.cookie由服务器向浏览器发送一个cookie,里面有key和value,还有一个对象参数。
读取cookie
安装中间件:cookie-parser
npm install cookie-parser
const express = require("express");
const cookieParser = require("cookie-parser");
var server = express();
server.listen(8080);
server.use(cookieParser());
server.use('/', (req, res) => {
console.log(req.cookies);
res.send("ok");
});
签名
利用签名可以判断这个cookie是否被修改过。并不是加密。
签名之前我们需要创建一个后端能使用的签名字符串,用于签名生成,并且后端创建cookie时还要启用{signed:true}
签名参数。
加密后的cookie无法通过req.cookies
获取,要使用req.signeCookies
来获取签名的cookie
const express = require("express");
const cookieParser = require("cookie-parser");
var server = express();
server.listen(8080);
server.use(cookieParser());
server.use('/', (req, res) => {
req.secret = "hsjkadhkjaqwgsda";
res.cookie('user', 'zhangsan', { signed: true });
console.log('未签名', req.cookies);
console.log('签名', req.signedCookies);
res.send("ok");
});
此时获取的签名的cookie会带有一大串签名文字,但实际上我们要获取的只要内容就行了,不需要签名,为此需要在cookieParser中间件中将secret签名字符传入即可。
const express = require("express");
const cookieParser = require("cookie-parser");
var server = express();
server.listen(8080);
server.use(cookieParser("hsjkadhkjaqwgsda"));
server.use('/', (req, res) => {
req.secret = "hsjkadhkjaqwgsda";
res.cookie('user', 'zhangsan', { signed: true });
console.log('未签名', req.cookies);
console.log('签名', req.signedCookies);
res.send("ok");
});
由于签名会将字符串加长从而增大了cookie的大小,但是cookie只有4k的存储,所以能不用签名就不用,从而节省体积
删除cookie
const express = require("express");
const cookieParser = require("cookie-parser");
var server = express();
server.listen(8080);
server.use(cookieParser("hsjkadhkjaqwgsda"));
server.use('/', (req, res) => {
res.clearCookie("user");
res.send("ok");
});
res.clearCookie("user");
删除对应name为user的cookie。
加密
使用一个中间件cookie-encrypter
,具体要看这个插件的使用文档了。
session
session是基于cookie的,所以使用方法要写在cookie之后,使用一个cookie-session
插件。
安装
npm install cookie-session
使用
const express = require("express");
const cookieParser = require("cookie-parser");
const cookieSession = require("cookie-session");
var server = express();
server.listen(8080);
server.use(cookieParser());
server.use(cookieSession({
keys: ["asnkjdjada", "dhasjigdas", "djkashdkjas"]
}));
server.use('/', (req, res) => {
if (req.session["count"] == null) {
req.session["count"] = 1;
} else {
req.session["count"]++;
}
console.log(req.session["count"]);
res.send("ok");
});
cookieSession要在cookieParser之后使用,并且他还有一个参数,参数必填keys,也就是类似于cookie签名用的那个字符串,session会一次调用对应的字符串对session id进行加密,理论上来说,kyes数组里面的字符越多,加密效果就越好。
然后在后面我们可以进行一次统计访问次数。
session默认会给浏览器两个cookie,一个为seesion的id,一个是id的加密密匙,每次请求都会更新一次密匙,防止id被修改。
而session除了keys还有两个参数
server.use(cookieSession({
name:"csss",
keys: ["asnkjdjada", "dhasjigdas", "djkashdkjas"],
maxAge: 2*3600*1000 //两个小时
}))
name是自定义cookie-session的name属性,maxAge为有效期,一般2个小时,有效期越长越不安全。
seesion存在于服务器,通过cookie的id来读取。
删除seesion
server.use('/', (req, res) => {
if(req.session["count"]){
delete req.session["count"];
}
res.send("ok");
});
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据