java中如何踢人下线?封禁某个账号后使其会话立即掉线!
需求场景
封禁账号是一个比较常见的业务需求,尤其是在论坛、社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁。
常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1时代表账号正常,其值为0时代表账号已被封禁。
当我们需要封禁一个账号时,只需要将其账号的status值修改为0即可,对方再次登录系统时,我们便可以检测到status值不为1禁止登录。
这种模式虽然思路简单,但也有一个不小的问题,那就是: 如果对方一直在线不注销登录呢?
由于我们只在登录时检测status值,这也就代表:如果对方不主动注销账号,他的会话还是会一直存在且有效。
那怎么才可以做到在封禁账号后立即生效?
你可能会想到使用拦截器,拦截用户的所有请求检测账号状态:status=0时禁止访问,status=1时再对请求放行
此方式虽然解决了问题,但是如果每次请求都要进行数据库查询的话,数据库表示你如此扫荡我你就没有一点心理压力吗?
那怎么办?上缓存?虽然可以缓解性能压力,但似乎总感觉没有完美解决问题。
真正的问题点在于:一个正常的系统只有0.01%的用户是需要封禁的,我们对其它99.99%用户的实时检测都是不必要的性能浪费。
在如上场景中,我们真正需要的是一个踢人下线的操作,即:我们需要在封禁某个用户后,使他的会话立即掉线,即时他重新登录也会被禁止登录
那么,怎么做到实时踢人下线呢?
笔者使用的是sa-token权限认证框架,这个框架封装了踢人下线操作调用非常方便,不用像其它框架一样还需要我自己再封装一层才能做到。
具体代码
- 首先添加
pom.xml框架
<!-- sa-token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.12.1</version>
</dependency>
- 在用户登录时将账号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的账号注销登录 (踢人下线)
如果觉得文章写得不错还请大家不要吝惜为文章点个赞,您的支持是我更新的最大动力!
最后附上项目链接:
- 官网文档:http://sa-token.dev33.cn/
- Gitee开源地址: https://gitee.com/sz6/sa-token
- GitHub开源地址: https://github.com/click33/sa-token
java中如何踢人下线?封禁某个账号后使其会话立即掉线!的更多相关文章
- java中Object类是怎么回事,干嘛使的?举例说明!
Object类的作用:m a r k - t o- w i n: 在java中,因为所有的类都有共性,所以java的缔造者们把java设计成这样:所有的类都是Object类的直接或间接子 ...
- Java中数组和集合的foreach操作编译后究竟是啥
今天和同事在关于foreach编译后是for循环还是迭代器有了不同意见,特做了个Demo,了解一下. 是啥自己来看吧! public class Demo { public static void m ...
- Spring Security框架中踢人下线技术探索
1.背景 在某次项目的开发中,使用到了Spring Security权限框架进行后端权限开发的权限校验,底层集成Spring Session组件,非常方便的集成Redis进行分布式Session的会话 ...
- Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java ...
- 【转】Java中只有按值传递,没有按引用传递!
原文链接:http://guhanjie.iteye.com/blog/1683637 今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底 ...
- 记录怎样把安全证书导入到java中的cacerts证书库
这次项目上需要去证书中解析公钥所以这里分享下方法: 首先准备一个证书文件比如叫:test.crt(一般是cer结尾) 下一步准备把证书导入到导入java中的cacerts证书库里 方法如下: 比如本地 ...
- JAVA中只有值传递
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- java中a++和++a的区别详解
java中的++操作无论在前还是在后,都是在变量自身的值加1,接下来将具体描述两者的区别 int a =5; int b =a++; System.out.println(b); 1.通俗易懂的理解是 ...
- Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
随机推荐
- Linux下安装mysql-5.7.24
Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的 ...
- matplotlib的学习2-基本用法
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1, 1, 50)#范围-1 到 1,个数是50 y = 2*x ...
- 程序运行慢?你怕是写的假 Python
Python程序运行太慢的一个可能的原因是没有尽可能的调用内置方法,下面通过5个例子来演示如何用内置方法提升Python程序的性能. 1. 数组求平方和 输入一个列表,要求计算出该列表中数字的的平方和 ...
- PHP功能代码片段
1.连接MYSQL数据库代码 <?php $connec=mysql_connect("localhost","root","root&qu ...
- Jquery Javascript 跳转页面传递参数以及获取url的参数
传递参数: window.location='editCourse.html?dataId='+dataId+''; 获取url中的参数(封装的方法): function getUrlParam ...
- 根据数据库反向生成PD
原博文 http://www.360doc.com/content/14/0820/20/12385684_403420399.shtml 步骤 File___Reverse Engineer___D ...
- React Hook 入门使用
React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...
- npm国内淘宝镜像
理由 由于npm的registry地址是国外的,速度很慢,所以推荐使用淘宝镜像:https://registry.npm.taobao.org 配置方法 临时配置 npm --registry htt ...
- postgresql 函数集合
1.空间对象字段不建议手动创建,建议使用语句生成空间对象字段,table_name:表名,column_name:生成的列名,3857:坐标系 SELECT AddGeometryColumn ('p ...
- Arduino IDE 开发 ESP-01S/ESP-01物联网实战检测温度湿度上传MQTT服务器
一.硬件准备 USB转ESP8266两块.DHT11温度湿度传感器.ESP8266-01/ESP8266-01一块(如果学习的话多买几块,ESP-01/ESP-01S的区别) USB转ESP8266 ...