【express】使用cookie和session保持登录状态

文档

https://www.expressjs.com.cn/en/resources/middleware/session.html

逻辑

=====登陆=====
后端获取账号密码
密码加密
查询账号是否存在
账号不存在
    返回错误码
账号存在
    查询密码是否符合
        不符合
            返回密码错误数据
        符合
            设置session
            设置cookie
            返回成功数据
=====登录状态保持=====
拦截所有请求(在登录路由之后,要不然登录不了)
请求是否带有cookie 
    不带cookie
        状态为未登录,返回错误码
    带cookie
        与session中对应的数据比较
            不同
                状态为未登录,返回错误码
            相同
                状态为已登录,跳到下一个中间件

中间件

cookie-parser

import cookieParser from 'cookie-parser';

app.use(cookieParser());

设置,读取

//读取
req.cookies[key]
//设置
res.cookie(key, value, config );

express-session

import session from 'express-session';

app.use(
  session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true,
    cookie: {
      maxAge: 60 * 60 * 1000,
    },
    rolling: true, //在每次请求时强行设置 cookie,重置 cookie 过期时间(默认:false)
  })
);

设置,读取

//读取
req.session[key]
//设置
req.session[key]=value

核心代码

app.ts


app.post('/login',(req,res,next)=>{
	let {username,password} = req.body
	if(用户存在&&账户密码正确){
		//简单的把账户名作为session和cookie
		req.session[username]=username
		res.cookie(username, username, { maxAge: 60 * 1000, httpOnly: true });
		res.send({msg:"登录成功"})
	}else{
		res.send({msg:"登录失败"})
	}
})
//拦截所有的请求
app.use((req,res,next)=>{
	//比较cookie和session
	if(req.cookies['username'] == req.session['username']){
		//相同,则视为已登录状态,跳到下一个中间件
		next()
	}else{
		//不同,则未登录,拦截请求,直接返回错误值。
		res.send({msg:"未登录"})
	}
})


版权声明:本文为qq_34838046原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。