Nodejs ·

nodejs系统保持一端登录

为了保证系统的安全性,一般情况下系统要保证一端登录,当其他端用相同的账号进行登录时,将会把该端账号进行退出操作。这种做法可以有效避免多人登录同一账号导致的重复修改或冲突操作,下面,将介绍一下在nodes下使用express-session来进行登录的session控制。

express-session应用

首先我们先来进行的就是安装express-session

npm install express-session

然后要做的就是进行配置了

const SessionTime = 30*60;
const sessionLoginInfo = 'app.session.'
let cookieSessionD = {
    maxAge:SessionTime*1000  // 
}
app.use(session({
    name: 'newaircloudProID',//存储在用户cookie中的key名
    secret: 'newaircloud',  // 用来对session id相关的cookie进行签名
    store: new RedisStrore({
        "host" : redisIP,
        "port" : redisPort,
        "pass" : redisPwd,
        "ttl" : SessionTime,//有效期30分钟,单位秒
        "prefix":sessionLoginInfo,
        "logErrors" : true
    }),  // 本地存储session(文本文件,也可以选择其他store,比如redis的)
    saveUninitialized: false,  // 是否自动保存未初始化的会话,建议false
    resave: true,  // 是否每次都重新保存会话
    rolling:true,// 是否每次都重新保存会话cookie
    cookie: cookieSessionD
}));

简单说明一下,这里我是将session存储到了redis中,这样存储的好处在于分布式系统,可以共享session;另一点在于当后台需要对该账号进行操作处理时,直接处理完成后将该session清空即可,当前账号就自动退出,重新登录则新的修改生效,不存在延迟。

保持系统单一端登录

这里先说一下实现方法。

首先我们知道每一个session都有一个唯一的标识,那就是sessionID。前面express-session的配置项中有一项prefix,这一配置项是用来配置存储在redis中的key的前缀,其后面跟的就是sessionID,如此拼出来的key存储的就是当前session信息。

那么我们要做的就是当登录的时候清除掉已经登录的session,其中遇到的问题就是这个sessionID如何获取的问题。

解决方案就是我们可以在登录的时候将sessionID存储到redis中,比如设置一个key为:app.sessionSingle.userCode,这个key中存储的就是当前登录的sessionID。

当登录时判断该key中是否有值,如果有,则将其对应的session信息清除,然后将此次sessionID存入。此外还需要将此key的过期时间设置的和session登录信息的过期时间保持一致,同时每次访问时需要将过期时间重置,以保证在对应的登录信息有效时间内,此值始终有效。

下面来看具体的代码实现


app.all('/*',async (req,res,next)=>{ if(req.method!='OPTIONS' &&!req.session.loginInfo){ console.log("未登录") res.json({ success:false, msg:"当前用户未登录" }); return }else{ let loginInfo = req.session.loginInfo //此处设置redis过期时间 //设置代码此处省略 next() } }) router.post('/login', async (req, res)=>{ let result = {success:false,msg:""} let params = req.body; try{ let currentSession = 'app.sessionSingle.'+userName let sessionOldInfo = x //从redis中获取sessionID,此处获取省略代码 let userInfo = { userName:"张三", password:"1243" } req.session.loginInfo = userInfo; if(sessionOldInfo){ //当key中存在sessionID时,则证明当前有用户登录,需清除其session信息 //删除的redis key为:sessionLoginInfo+sessionOldInfo } let sessionID = req.sessionID //将sessionID存入currentSession,同时设置过期时间 result.success = true; result.msg = "登录成功"; result.info = userInfo res.json(result); }catch(e){ console.log(e.stack); result.msg="系统异常,登录失败"; res.json(result) } });

参与评论