在企业级项目中,踢人下线是一个很常见的需求,如果要设计比较完善的话,至少需要以下功能点:
可以根据用户 userId 踢出指定会话,对方再次访问系统会被提示:您已被踢下线,请重新登录。可以查询出一个账号共在几个设备端登录,并返回其对应的 Token 凭证,以便后续操作。可以只踢出一个账号某一个端的会话,其他端不受影响。例如在某电商APP上可以看到当前账号共在几个手机上登录,并注销指定端的会话,当前端不受影响。手动从零开始设计满足需求的会话架构,还是需要一定的代码量的。本篇将介绍如何使用 Sa-Token 方便的完成上述需求,Sa-Token 框架对踢人下线做了较为完整的封装,我们可以使用极少的代码就完成踢人下线功能。
Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。Gitee 开源地址:https://gitee.com/dromara/sa-token
(资料图片仅供参考)
首先在项目中引入 Sa-Token 依赖:
cn.dev33 sa-token-spring-boot-starter 1.34.0
注:如果你使用的是 SpringBoot 3.x
,只需要将 sa-token-spring-boot-starter
修改为 sa-token-spring-boot3-starter
即可。
先看看 Sa-Token 为我们提供的与踢人下线有关的API。
强制注销:
StpUtil.logout(10001); // 强制指定账号注销下线 StpUtil.logout(10001, "PC"); // 强制指定账号指定端注销下线 StpUtil.logoutByTokenValue("token"); // 强制指定 Token 注销下线
踢人下线:
StpUtil.kickout(10001); // 将指定账号踢下线 StpUtil.kickout(10001, "PC"); // 将指定账号指定端踢下线StpUtil.kickoutByTokenValue("token"); // 将指定 Token 踢下线
强制注销 和 踢人下线 的区别在于:
强制注销等价于对方主动调用了注销方法,再次访问会提示:Token无效。踢人下线不会清除Token信息,而是将其打上特定标记,再次访问会提示:Token已被踢下线。动态图演示:
下面开始进行代码实战。
三、根据账号踢人下线在完成踢人下线之前,我们需要先让会话完成登录。正常的登录需要根据 username
+ password
判断账号合法性,由于我们本篇的重点是 踢人下线,所以此处简化一下登录操作,直接填入 userId 进行登录。
package com.pj;import cn.dev33.satoken.stp.StpUtil;import cn.dev33.satoken.util.SaResult;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * 测试踢人下线 */@RestController@RequestMapping("/kick/")public class KickController { // 会话登录接口 ---- http://localhost:8081/kick/doLogin?id=10001 @RequestMapping("doLogin") public SaResult doLogin(long userId) { StpUtil.login(userId); return SaResult.ok("登录成功,Token 凭证为:" + StpUtil.getTokenValue()); } // 验证当前客户端是否登录 ---- http://localhost:8081/kick/checkLogin @RequestMapping("checkLogin") public SaResult checkLogin() { StpUtil.checkLogin(); // 下面是登录后才会返回的数据 return SaResult.ok("您已登录成功,userId=" + StpUtil.getLoginId()); } // 根据账号Id踢人下线 ---- http://localhost:8081/kick/kickout @RequestMapping("kickout") public SaResult kickout(long userId) { StpUtil.kickout(userId); return SaResult.ok("将账号 " + userId + " 踢下线成功"); } // 全局异常拦截 @ExceptionHandler public SaResult handlerException(Exception e) { e.printStackTrace(); return SaResult.error(e.getMessage()); }}
运行代码,分别用三个独立的浏览器测试登录:
// 使用浏览器 1 测试登录账号 10001http://localhost:8081/kick/doLogin?userId=10001// 使用浏览器 2 测试登录账号 10002http://localhost:8081/kick/doLogin?userId=10002// 使用浏览器 3 测试登录账号 10003http://localhost:8081/kick/doLogin?userId=10003
之所以使用三个独立的浏览器来测试,是为了避免会话的相互覆盖,造成逻辑不可控。访问成功的话,服务端的返回信息会类似如下:
{"code": 200,"msg": "登录成功,Token 凭证为:f53ac098-aed4-4de2-9223-8c3f1dab656d","data": null}
然后使用三个浏览器分别访问登录验证接口:
http://localhost:8081/kick/checkLogin
返回信息如下:
{"code": 200,"msg": "您已登录成功,userId=10001","data": null}
现在开始测试踢人下线,使用任意浏览器访问:
http://localhost:8081/kick/kickout?userId=10002
返回信息:
{"code": 200,"msg": "将账号 10002 踢下线成功","data": null}
账号 10002 将被踢下线成功,现在我们再使用浏览器2 测试一下 10002 是否仍然在线:
{"code": 500,"msg": "Token已被踢下线:aa5911a6-3623-4fdb-98d0-055c46353981","data": null}
可以看到,10002会话已失效,无法通过登录校验。
四、根据 Token 踢人下线业务场景举例:我要在APP上查看我的账号共在几个设备登录,并且将除我之外的设备全部踢下线。
首先我们需要在 application.yml
中添加配置:
sa-token: is-share: false
is-share 的含义是:在多人登录同一账号时,是否共用同一个 Token:
此值为 true 时,所有登录共用一个Token。此值为 false 时,每次登录新建一个Token。在以上 KickController
的基础上,继续添加接口:
/** * 测试踢人下线 */@RestController@RequestMapping("/kick/")public class KickController {// 其他代码...// 以下是需要新添加的代码 // 查询我的账号已经在几个设备登录 ---- http://localhost:8081/kick/tokenList @RequestMapping("tokenList") public SaResult tokenList() { long currUserId = StpUtil.getLoginIdAsLong(); List tokenList = StpUtil.getTokenValueListByLoginId(currUserId); return SaResult.data(tokenList); } // 根据 Token 踢人下线 ---- http://localhost:8081/kick/kickoutToken?token=xxxx @RequestMapping("kickoutToken") public SaResult kickoutToken(String token) { StpUtil.kickoutByTokenValue(token); return SaResult.ok("将Token: " + token + " 踢下线成功"); }}
重启项目(如果集成 Redis 了就清空 Redis数据一下),分别从三个独立的浏览器测试访问:
http://localhost:8081/kick/doLogin?userId=10001
返回如下:
{"code": 200,"msg": "登录成功,Token 凭证为:450b8b73-f52d-4496-b67e-bdd579c8708a","data": null}
仔细观察三个浏览器返回的信息,虽然三个浏览器都是登录账号 10001,但是每次返回的 Token 凭证都是不一样的。
现在查询一下当前账号一共在几个设备完成了登录:
http://localhost:8081/kick/tokenList
返回如下:
{"code": 200,"msg": "ok","data": ["450b8b73-f52d-4496-b67e-bdd579c8708a","39d7974b-327d-4aea-a0b7-d90ab47caf0c","d73c1bc5-d04f-4dc2-81ee-42c9438f9d78"]}
现在选一个 Token,将其踢下线:
http://localhost:8081/kick/kickoutToken?token=d73c1bc5-d04f-4dc2-81ee-42c9438f9d78
返回信息如下:
{"code": 200,"msg": "将Token: d73c1bc5-d04f-4dc2-81ee-42c9438f9d78 踢下线成功","data": null}
然后在对应的浏览器,验证一下登录状态:
http://localhost:8081/kick/checkLogin
返回如下:
{"code": 500,"msg": "Token已被踢下线:d73c1bc5-d04f-4dc2-81ee-42c9438f9d78","data": null}
可以看到,该设备登录的会话已被踢下线。那么同账号的其他设备有没有受到影响呢,我们从其他浏览器验证一下:
http://localhost:8081/kick/checkLogin
返回如下:
{"code": 200,"msg": "您已登录成功,userId=10001","data": null}
可以看到,只有踢出的 Token 被强制下线了,其他端并没有受到影响。
参考资料Sa-Token 文档:https://sa-token.ccGitee 仓库地址:https://gitee.com/dromara/sa-tokenGitHub 仓库地址:https://github.com/dromara/sa-token上一篇:《瞭望大湾区》:中央财政支持提高义务教育学校公用经费保障水平
下一篇:最后一页
一、需求在企业级项目中,踢人下线是一个很常见的需求,如果要设计比较完善的话,至少需要以下功能点:可以
为深入贯彻落实党的二十大精神,适应新时代学校德智体美劳“五育”并举需要,中央财政进一步优化完善城...
近日,中国经济体制改革研究会在京发布《2023年第一季度改革热度第三方评估报告》。报告显示,在31个省会城
5月5日,西安市长安区医院眼科成功为一名六旬老人按照日间手术标准化流程进行了手术,整个手术过程约10分钟
00:52原标题:上海20岁女子被3万卖到安徽当新娘2021年6月,魏先生向上海奉贤警方报案,称自己的女儿小娇很
1、这个研究所特别不好,因为招不到人,像一些很差的二表三表院校,他们都签,比如哈理工,黑科技之类。2、
有投资者在投资者互动平台向华利集团(300979 SZ)提问,“公司一季度营业收入下滑
1、武汉金桔世纪信息科技有限公司于2013年07月24日成立。2、法定代表人夏永华,公司经营范围包括:计算机软
犯罪分子故意“制造”交通事故,“碰瓷”公交车,让公交车司机防不胜防,这个犯罪团伙如何运作?会面临...
其中,厦门国贸子公司厦门保润房地产开发有限公司单笔抵押财产评估价值约102 588亿元,单笔抵押资产金额超
针对斗鱼平台存在的色情、低俗等严重生态问题,5月8日,国家互联网信息办公室指导湖北省互联网信息办公室派
5月6日上午,甘州区大满镇朱家庄村2万头生猪繁育基地建设项目开工建设,正式打响了该镇村集体经济公司参与
1、荒唐、荒诞、荒谬的区别为:一、指代不同荒唐:(思想、言行)错误到使人觉得奇怪的程度。2、2、荒诞:
“张颂文好像离开《狂飙》就不行了”“张颂文也救不回票房”……近日,如是言论频频出现在电影《不止不...
好消息!宝山罗店地区中集金地美兰城公租房项目现已正式推出,对外出租啦。项目介绍中集金地美兰城公租房项
领导上场满15分钟可加罚点球?别踢出献媚的庸俗味---5月8日,一张“省直机关第七届运动会足球比赛规程”...
5月6日,2023赛季中甲联赛进入到第3轮的角逐,延边龙鼎足球队坐镇主场迎战石家庄功夫,比赛在延吉全民健身
4月16日,2023年上海车展前夕,华为正式发布了HUAWEIADS2 0(ADS为“高阶智能驾驶系统”)及智能座舱、智能
人间五月天,桑葚满枝头。5月7日上午,“甜蜜之城吐鲁番满城摇落桑葚雨”2023新疆吐鲁番桑葚节在吐鲁番...
奥普光电(002338)2022年度网上业绩说明会5月8日下午在全景路演举办。公司董事长孙守红在本次路演上表示,
App5月8日消息,万邦达公告,公司目前持有参股公司青海锦泰钾肥有限公司(简称“锦泰钾肥”)10 977%的...
1、你好!作为流量计厂家技术,觉得很有必要帮你解答一下:首先第一个问题,1 对直管段的要求?为保证流体
5月8日消息,工业和信息化部、商务部近日印发通知,组织开展2023“三品”全国行活动。其中提到深化产销...
每经AI快讯,5月8日,鲁抗医药公告,公司收到国家药品监督管理局颁发的关于注射用氨苄西林钠的《药品补充申
清明节是中国传统的重要节日,也是祭祖的日子。在这个节日里,一些地方的人们会准备一些特别的菜肴来祭祖和
X 关闭
X 关闭