需求场景

封禁账号是一个比较常见的业务需求,尤其是在论坛、社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁。

常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1时代表账号正常,其值为0时代表账号已被封禁。

当我们需要封禁一个账号时,只需要将其账号的status值修改为0即可,对方再次登录系统时,我们便可以检测到status值不为1禁止登录。

这种模式虽然思路简单,但也有一个不小的问题,那就是: 如果对方一直在线不注销登录呢?

由于我们只在登录时检测status值,这也就代表:如果对方不主动注销账号,他的会话还是会一直存在且有效。

那怎么才可以做到在封禁账号后立即生效?

你可能会想到使用拦截器,拦截用户的所有请求检测账号状态:status=0时禁止访问,status=1时再对请求放行

此方式虽然解决了问题,但是如果每次请求都要进行数据库查询的话,数据库表示你如此扫荡我你就没有一点心理压力吗?

那怎么办?上缓存?虽然可以缓解性能压力,但似乎总感觉没有完美解决问题。

真正的问题点在于:一个正常的系统只有0.01%的用户是需要封禁的,我们对其它99.99%用户的实时检测都是不必要的性能浪费。

在如上场景中,我们真正需要的是一个踢人下线的操作,即:我们需要在封禁某个用户后,使他的会话立即掉线,即时他重新登录也会被禁止登录

那么,怎么做到实时踢人下线呢?

笔者使用的是sa-token权限认证框架,这个框架封装了踢人下线操作调用非常方便,不用像其它框架一样还需要我自己再封装一层才能做到。

具体代码首先添加pom.xml框架

cn.dev33

sa-token-spring-boot-starter

1.12.1

在用户登录时将账号id写入会话中@RestController

@RequestMapping("user")

public class UserController {

@RequestMapping("doLogin")

public String doLogin(String username, String password) {

// 此处仅作示例模拟,真实项目需要从数据库中查询数据进行比对

if("zhang".equals(username) && "123456".equals(password)) {

StpUtil.setLoginId(10001);

return "登录成功";

}

return "登录失败";

}

}将指定id的账号// 使指定id账号的会话注销登录,对方再次访问系统时会抛出`NotLoginException`异常,场景值为-5

@RequestMapping("kickout")

public String kickout(long userId) {

StpUtil.logoutByLoginId(userId);

return "剔出成功";

}

关键代码就在 StpUtil.logoutByLoginId(userId) 这一句,使指定id的账号注销登录 (踢人下线)

如果觉得文章写得不错还请大家不要吝惜为文章点个赞,您的支持是我更新的最大动力!

最后附上项目链接:

java实现踢下线用户_java中如何踢人下线?封禁某个账号后使其会话立即掉线!...相关推荐

  1. java脚本封号_java中如何踢人下线?封禁某个账号后使其会话立即掉线!

    需求场景 封禁账号是一个比较常见的业务需求,尤其是在论坛.社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁. 常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1 ...

  2. java怎么封禁玩家_java中如何踢人下线?封禁某个账号后使其会话立即掉线!

    需求场景 封禁账号是一个比较常见的业务需求,尤其是在论坛.社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁. 常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1 ...

  3. java怎么实现七天封禁玩家_java中如何踢人下线?封禁某个账号后使其会话立即掉线!...

    需求场景 封禁账号是一个比较常见的业务需求,尤其是在论坛.社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁. 常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1 ...

  4. java实现踢下线用户_浅谈踢人下线的设计思路!(附代码实现方案)

    前言 前两天写了一篇文章,主要讲了下java中如何实现踢人下线,原文连接:java中如何踢人下线?封禁某个帐号后使其会话当即掉线!前端 原本只是简单阐述一下踢人下线的业务场景和实现方案,没想到引出那么 ...

  5. java char 初始化为空格_java中char的初始值此代码运行后,char的初始值为空?为 爱问知识人...

    jdk官方教程里有写 Default Values(缺省值) ----------------------------------------------------- |Data Type |Def ...

  6. java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...

    展开全部 方法如下: Random ran=new random(); boolean flag=true; while(flag){ int a=ran.nextInt(99999999); int ...

  7. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

  8. java 基本类型的引用_Java中的基本数据类型与引用数据类型

    一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...

  9. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

最新文章

  1. 谁是中国大学理科的王者?
  2. 对分贝(dB)概念的理解
  3. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_WhatsApp缓冲区漏洞曝光 攻击者可通过MP4文件执行远程代码...
  4. vue hot true 不起作用_从源码解读 Vuex 注入 Vue 生命周期的过程
  5. 操作系统原理_读懂操作系统之缓存原理(cache)(三)
  6. 深度学习笔记(31) 迁移与增强
  7. python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间
  8. c语言 统计数量用count_c语言中统计重复数字次数 c语言问题 统计不同数字的个数...
  9. docker mysql 阿里云_阿里云docker部署mysql
  10. Cocos2dx游戏开发系列笔记3:牛刀小试-忍者飞镖射幽灵的Demo
  11. mac 查看环境变量_Mac开工利器Homebrew介绍
  12. mysql的简单实用_MySQL的简单实用 手把手教学
  13. 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)
  14. Android系统信息获取 之十二:获取屏幕分辨率及密度
  15. bash复杂脚本解释
  16. 电阻用计算机怎么算,电阻分压计算器
  17. 佳博打印机ip地址修改软件_【动手实践】树莓派将有线打印机转为无线共享打印机 by xinlong...
  18. FEMTransfer软件实现Patran/Nastran/Abaqus/Ansys/Sesam(Genie)/Workbench/Femap/盈建科/PKPM仿真分析软件的有限元模型相互转换导入
  19. CF#552div3题解
  20. 《麻省理工学院公开课:人工智能》笔记一

热门文章

  1. hadoop Combine output records和Reduce input records不相等
  2. 数据库查询速度优化之解决技巧
  3. Spring JTA分布式事务实现
  4. 遥感数字图像处理(复习)
  5. 计算机的语言分高低?
  6. 关于如何正确加入服务器的教程
  7. 自动驾驶商用,小马智行、百度Apollo各有妙招?
  8. JAVA:用户登录验证
  9. 源码下载java利用jquery和smartupload实现头像上传切割效果
  10. ntohs和htons的区别