Nodejs-会话控制

0 阅读3分钟

1.会话控制-(cookie、session、token)

cookie、session多用于网站
token多用于app

image.png

1.1 session

image.png

1.1.1 在express框架中设置session

npm i express-session
npm i connect-mongo

使用session中间件

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

const app = express();

// 设置session的中间件
app.use(session({
  name:'sid', // 设置session的cookie名称,默认是connect.sid
  secret:'abcdefg', // 设置session的密钥,用于签名session的cookie
  saveUninitialized:false, // 是否在会话初始化时保存会话,默认是false
  resave:true, // 是否在每次请求时重新保存会话,默认是false
  cookie:{
    maxAge:1000*60*10
  },
  store:MongoStore.create({
    url:'mongodb://localhost:27017/cookie' // 设置数据库连接字符串
  }),
  cookie:{
    httpOnly:true, //开启后前端无法通过js操作
    maxAge:1000*60 //cookie和session同步过期时间,默认是1000*60
  }
}))


app.get('/', (req, res) => {
  res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
  res.setHeader('Content-Type', 'text/plain');

 res.send('home')
});




// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

1.1.2 session中session校验操作设置

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo').default || require('connect-mongo');

const app = express();

// 设置session的中间件
app.use(session({
  name:'sid', // 设置session的cookie名称,默认是connect.sid
  secret:'abcdefg', // 设置session的密钥,用于签名session的cookie
  saveUninitialized:false, // 是否在会话初始化时保存会话,默认是false
  resave:true, // 是否在每次请求时重新保存会话,默认是false
  cookie:{
    maxAge:1000*60*10
  },
  store:MongoStore.create({
    mongoUrl:'mongodb://localhost:27017/cookie' // 设置数据库连接字符串
  }),
  cookie:{
    httpOnly:true, //开启后前端无法通过js操作
    maxAge:1000*60 //cookie和session同步过期时间,默认是1000*60
  }
}))

app.get('/', (req, res) => {
  res.send('this is home page')
});

// 登录
app.get('/login', (req, res) => {
// 传入admin和password参数
if(req.query.username === 'admin' && req.query.password === '123456'){
  // 设置session
  req.session.username = 'admin';
  req.session.password = '123456';
  res.send('登录成功')
}else{
  res.send('登录失败')
}
});




// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

image.png 成功在MongoDB中查看到session数据

image.png

1.1.3 session的读取

image.png

image.png

1.1.4 session的销毁

使用destroy

image.png

image.png

1.2 cookie

image.png

1.2.1 在express框架中设置cookie-(cookie默认会在浏览器关闭时销毁)

image.png

1.2.1.1 默认cookie是在浏览器关闭时自动销毁的
const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  res.cookie('name', 'tom');
 res.send('home')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

image.png

1.2.1.2 设置max-age实现cookie持久化(maxAge单位为毫秒,但报文内的单位为秒)

设置cookie生命周期为一分钟

const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  res.cookie('name', 'jennie',{maxAge: 1000 * 60 });
 res.send('home')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

image.png

image.png 一分钟后再查看cookie

1.2.2 在express中删除cookie(使用clearCookie方法)

设置两个cookie(一个name,一个theme),实现只删除name的cookie

const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  res.cookie('name', 'jennie',{maxAge: 1000 * 60 });
  res.cookie('theme', 'dark')
 res.send('home')
});
// 删除cookie
app.get('/delete-cookie', (req, res) => {
  res.clearCookie('name');
  res.send('删除成功')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

结果:只剩下theme的cookie

image.png

1.2.3 在express框架中取出cookie

安装cookie-pasrser(就可以使用parser中间件)

npm i cookie-parser

导入cookieparser中间件

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

app.get('/', (req, res) => {
  res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  res.cookie('name', 'mark');
  res.cookie('theme', 'dark')
 res.send('home')
});

// 获取cookie
app.get('/get-cookie', (req, res) => {
  console.log(req.cookies);
  res.send(`欢迎${req.cookies.name},您的主题是${req.cookies.theme}`);
});

// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});

访问get-cookie路由查看效果

image.png

1.3 token(主要用于小程序、移动端)

image.png

2 JWT-(JSON Web Token)

2.1 创建生成token

// 导入jwt模块
const jwt = require('jsonwebtoken');

// 创建生成token(sign(用户数据,加密字符串,配置对象))
let token = jwt.sign({username: 'admin'}, 'secretKey', {expiresIn: 60});
console.log(token);

// 校验token

image.png

2.2 使用jwt.verify方法校验token

// 导入jwt模块
const jwt = require('jsonwebtoken');

// 创建生成token(sign(用户数据,加密字符串,配置对象))
let token = jwt.sign({username: 'admin'}, 'secretKey', {expiresIn: 60});
console.log(token);

// 校验token
jwt.verify(token, 'secretKey', (err, decode) => {
  if (err) {
    console.log('验证失败');
  } else {
    console.log('验证成功');
    console.log(decode);
  }
})

结果:

image.png