1、客户端用户名跟密码请求登录
2、服务端收到请求,去库验证用户名与密码
3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
4、客户端收到 响应 以后可以把收到的字符存到cookie
5、客户端每次向服务端请求资源的cookie会自动携带
6、服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据
let express = require('express')
//引入中间件
let cookieSession = require('cookie-session')
let app = express()
app.use(express.static('./www'))
app.use(cookieSession({
name:"xixi",
keys:['aa','bb','cc'],
maxAge:1000*60*60*24//存多久
}))
//登录
app.get('/api/login',(req,res)=>{
req.session['wind']='userId'
res.send({
error:0,
data:{
a:1,
b:2
}
})
})
//自动登录
app.get('/api/user',(req,res)=>{
let pass = req.session['wind']
if(pass){
res.send({
err:0,
data:'假数据'
})
}else{
res.send({
err:1,
data:'未登录或过期'
})
}
})
//删除
app.get('/api/loginout',(req,res)=>{
req.session.wind = undefined
res.end()
})
//监听
app.listen(3048,'localhost',()=>{
console.log('server is running')
})
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
let express = require('express')
//引入中间件
let bodyParser = require('body-parser')
let jwt = require('jsonwebtoken')
let app = express()
app.use(bodyParser())
app.listen(3021,'localhost',()=>console.log('server is running'))
//生成token
app.post('/api/login',(req,res)=>{
console.log('携带的数据',req.body)
//兜库
let token = jwt.sign({
username:req.body.username,
userId:'数据库里的数据'
}, "windrise", {
expiresIn:60*60
})
//返回
res.send({
err:0,
data:'库数据',
msg:"登录成功",
token:token
})
})
//校验token
app.get('/api/user',(req,res)=>{
//获取token
let token = req.body.token || req.query.token || req.header.token;
//校验token
jwt.verify(token, "windrise", (err,decode)=>{
console.log('err',err)
console.log('decode',decode)
if(err){
res.send({
err:1,
msg:'未登录或已过期'
})
}else{
res.send({
err:0,
msg:'登录成功',
data:'数据库'
})
}
})
})
在使用session会存在多服务粘性问题,session是发送到服务器中,当你在第一台服务器中存了数据,第二台服务器中并没有原来的数据;而token则不会存在这种问题,token是将服务器端发回来的数据存储在地址栏中,所以不影响服务器的更换