Cookie 和 Session 是网站常用的数据存储方式。Cookie 可以长时间存储,一般用来存储用户的登录凭证,可以让用户在进入网站后就能自动登录。Session 在关闭浏览器后会被销毁,可以用来存储用户的登录状态和一些零时数据。

Cookie 是保存到浏览器端的,浏览器在发送请求的时候也会把 Cookie 一起发送到后端,普通的 Cookie 前后端都能操作。Session 也是通过 Cookie 的方式保存到浏览器端。

Cookie

Express 操作 Cookie 需要通过 cookie-parser 中间件来实现,下面使用 npm 安装 cookie-parser:

npm install cookie-parser --save

添加 Cookie

下面在收到 HTTP 请求的时候添加一个 Cookie:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册 cookieParser
app.use(cookieParser());
// get 请求
app.get('/', (req, res) => {
  // 添加 cookie
  res.cookie('name', 'Mr. Ma', {
    maxAge: 7 * 86400000
  });
  res.send('Cookie 设置完成');
});

上面添加了一个 Cookie,Cookie 名称是 name ,Cookie 内容是 Mr. Ma ,Cookie 的有效期是 7 天,其中 7 * 86400000 就是 7 天的毫秒数。

在路由处理函数中可以使用 res.cookie 添加 Cookie,第一个参数是 Cookie 名称,第二个参数是 Cookie 值,第三个参数是选项,选项是一个对象,其中包含:

  • maxAge :以毫秒为单位设置 Cookie 的有效期
  • expires :以 GMT 时间设置 Cookie 的有效期
  • path :设置 Cookie 的路径,默认是 /
  • signed :设置 Cookie 签名

为了避免 Cookie 内容被篡改,在设置 Cookie 的时候可以给 Cookie 设置一个签名,下面添加一个带签名的 Cookie:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册 cookieParser 的时候传入一个签名
app.use(cookieParser('www.misterma.com'));

app.get('/', (req, res) => {
  // 添加 cookie
  res.cookie('user', 'Mr. Ma', {
    maxAge: 7 * 86400000,
    signed: true
  });
  res.send('Cookie 设置完成');
});

访问 Cookie

下面访问一个带签名的 Cookie:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册 cookieParser 的时候传入一个签名
app.use(cookieParser('www.misterma.com'));

app.get('/', (req, res) => {
  // 访问带签名的 Cookie
  const userCookie = req.signedCookies.user;
  res.send(userCookie);
});

在路由处理函数中使用 req.signedCookies.名称 就可以访问带签名的 Cookie。

下面访问一个不带签名的 Cookie:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册 cookieParser
app.use(cookieParser());

app.get('/', (req, res) => {
  const userCookie = req.cookies.userName;
  res.send(userCookie);
});

不带签名的 Cookie 使用 req.cookies.名称 就可以访问到。

删除 Cookie

下面删除名为 userName 的 Cookie:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册 cookieParser
app.use(cookieParser());

app.get('/', (req, res) => {
  res.clearCookie('userName');
  res.send('Cookie 已删除');
});

删除 Cookie 也是在路由处理函数中使用 res.clearCookie 删除,参数就是 Cookie 名称。

Session

Express 操作 Session 也需要 express-session 中间件,使用 npm 安装 express-session:

npm install express-session --save

添加 Session

下面添加一个名为 userName 的 Session:

const express = require('express');
const session = require('express-session');
const app = express();

// 注册 session 中间件
app.use(session({
  secret: 'www.misterma.com',
  resave: false,
  saveUninitialized: true
}));

app.get('/', (req, res) => {
  req.session.userName = 'Mr. Ma';
  res.send('Session 设置成功');
});

注册 express-session 中间件需要传入一个对象,内容包括:

  • secret :用于加密的字符串
  • resave ;每次请求都重新保存会话,无论内容是否修改
  • saveUninitialized :是否自动保存未初始化的会话

在路由处理函数中可以通过 req.session.名称 来设置 Session,读取 Session 也是直接使用 req.session.名称

app.get('/', (req, res) => {
  const userSession = req.session.userName;
  res.send(userSession);
});

删除 Session

下面删除 Session:

app.get('/', (req, res) => {
  req.session.destroy(err => {
    if (err) res.send('删除 Session 时发生错误');
    res.send('成功删除 Session');
  });
});

在路由处理函数中使用 req.session.destroy 可以销毁 Session,参数是一个可选的回调函数,在删除完成后触发。