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");
});
分类: Node 标签: cookieexpressseesion

评论

暂无评论数据

暂无评论数据

目录