java 单用户登录_限制单用户多地登录

Nodejs的做法

在上一篇文章Nodejs中的JWT和Session中,我最后采用了session的形式做用户识别与授权,根据业务要求,系统需要单点登录功能,描述如下

单点登录:限制同一帐号同一时刻只能一个用户登录使用,像QQ一样

一开始接到这个需求的时候在想应该如何来做,上网查找关键字单点登录,发现搜索到的并不是需求中描述的单点登录(怀疑需求中的单点登录并不是叫单点登录),最后换了一些关键词才找到如何实现的,参照这篇博客1以及博客2我做了如下一些整理

实现在线列表

用户异地登录后上一登录状态失效

用户正常退出或关闭浏览器(标签页)登录状态失效

a6f45fe2af0d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

单点登录流程

实现在线列表这里我采用redis来存储登录状态,3的部分session的机制已经帮我们解决了这个问题,具体的代码实现如下

//额外引入redis && connect-redis

npm i redis && connect-redis --save

//node

const cookieParser = require('cookie-parser');

const session = require('express-session');

const redis = require('redis');

const redisStore = require('connect-redis')(session);

const redisClient = redis.createClient({

host: 'localhost',

port: 6379

})

const store = new redisStore({

client: redisClient,

logErrors: true

})

app.use(cookieParser(config.secret));

app.use(session({

secret: ‘justyoulike’,

resave: true,

saveUninitialized: false,

rolling: true,

store: store,

genid: req => {

//生成唯一ID作为reids存储的key值

//key = username + '/' + random

let username = req.body.username;

return `${username}/${parseInt(Math.random() * 1000)}`

},

cookie: {

maxAge: config.maxAge

}

}))

//在login的逻辑中插入如下代码片段

redis.keys(`sess:${username}/*`, (err, reply) => {

if (! err && reply.length > 0) {

//这一步可以确保用户异地登录后上一登录状态失效

redis.del(reply[0]);

}

})

Java的做法

如果你的项目里采用了Spring Security,那么使用以下配置可以很方便的达成目的。当然,也可以选择重写它的内部类

//web.xml

org.springframework.security.web.session.HttpSessionEventPublisher

//应用程序部分,如我的项目中的applicationContext-security.xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值