- 基于服务器渲染的传统web开发模式
优点:
缺点:
//服务器通过字符串的拼接,发送给前端
app.get("/user", function (req, res) {const user ={name:'乞力马扎罗',age:'24'}// res.send()方法,可以把处理好的json内容,发送给客户端res.send(`姓名:${user.name},年龄:${user.age}`)
})
- 基于前后端分离渲染的新型web开发模式
优点:
缺点:
基于服务器渲染和前后端分离的两种开发模式,分别有不同的身份认证方案
在Express项目中,只需要安装中间件,即可在项目中使用Session认证
express-session中间件安装成功后,需要通过app.use()来注册session中间件
//express-session中间件
//导入session中间件
const session = require('express-session')
//注册session
app.use(session({secret: "key", //值,负责对session加密resave: false, //固定写法saveUninitialized: true, //固定写法
}))
- 配置成功后,即可通过req.session来访问和使用session对象,从而存储用户的关键信息
- 只有配置了express-session这个中间件,才能通过req点出来session这个属性
- 如果post请求,配置这个app.use(express.urlencoded({extended:false})),不然post请求是空
//express-session中间件
//导入session中间件
const session = require('express-session')
// 导入express
const express = require('express')
// 创建web服务器
const app = express()
// 启动文本服务器
app.listen(80,()=>{console.log("80服务器启动")
})
//注册session
app.use(session({secret: "key", //值,负责对session加密resave: false, //固定写法saveUninitialized: true, //固定写法
}))
//配置这个,不然post请求是空
app.post('/login', (req, res) => {if (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {return res.send({'status': 0,msg: "登录失败"})}//只有配置了express-session这个中间件,才能通过req点出来session这个属性//通过 req.session追加任何属性req.session.user = req.bodyreq.session.islogin = trueres.send({'status': 1,msg: "登录成功"})
})
//向session中取数据
app.post('/getuserinfo', (req, res) => {console.log(req.session.user)// 判断用户是否登录if (!req.session.islogin) {res.send({'status': 0,msg: "请登录"})return}res.send({'status':1, data:req.session.user})
})
- 调用req.session.destroy()函数,即可清空服务器保存的session信息·
- 只会清空调用这个的当前用户的session信息,而不是清空所有的session信息
- 调用场景,退出登录
app.post('/outlogin', (req, res) => {req.session.destroy()res.send({'status':1, msg:'退出成功'})
})
JWT,全称:JSON Web Token,是目前最流行的跨域认证解决方案
Authorization: Bearer
npm install jsonwebtoken express-jwt
const jwt = require("jsonwebtoken")
const expressjwt = require("express-jwt")
定义secret秘钥
const jwt = require("jsonwebtoken")
const {expressjwt} = require("express-jwt")
//定义secret秘钥,
const secretKey="adminpossword"
app.post('/jwtlogin', (req, res) => {let user=req.bodyif (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {return res.send({'status': 0,msg: "登录失败"})}//调用jwt.sign()生成JWT字符串,三个参数分别是,用户信息对象,加密秘钥,配置对象(expiresIn代表token有效期)res.send({'status': 1,msg: "登录成功",token:jwt.sign(user,secretKey,{expiresIn:'30s'})})
})
// 1,使用app.use()注册
// 2,expressjwt({secret:secretKey})就是用来解析的中间件
// 3,.unless({path:[/^\/api\//]})用来指定哪些接口不需要访问权限
//4,algorithms:['HS256']必写
// 配置过 express-jwt 可通过 req.auth 获取token信息
app.use(expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({ path: [/^\/api\//]}))
app.post('/getuser', (req, res) => {console.log(req.user) res.send({status: 1,msg: "成功",data:req.auth})
})
//错误中间件
app.use((err, req, res, next) => {console.log(err)if (err.name === 'UnauthorizedError') {return res.send({status: 401,message: "无效token"})}res.send({status: 500,message: "未知错误"})
})