SpringBoot + Shiro实现当前在线人数统计

摘要:
实现思路数据库中添加用户是否登录is_login字段,用来记录用户的登录状态,假设1表示在线;0表示未在线,则需要进行控制:1)当用户登录成功时,设置用户登录状态为12)当用户退出登录时,设置用户登录状态为03)当session失效时,设置对应的用户的登录状态为0实现方法1、更改数据库字段,编写登录状态更新函数添加字段后,编写状态更新函数/**更改用户登录状态*/voidupdateLoginSt
实现思路

数据库中添加用户是否登录is_login字段,用来记录用户的登录状态,假设1表示在线;0表示未在线,则需要进行控制:

1)当用户登录成功时,设置用户登录状态为1

2)当用户退出登录时,设置用户登录状态为0

3)当session失效时,设置对应的用户的登录状态为0

实现方法

1、更改数据库字段,编写登录状态更新函数

添加字段后,编写状态更新函数

/**更改用户登录状态 */
void updateLoginStatus(@Param("userId") String userId, @Param("islogin") Integer islogin);
<update id="updateLoginStatus">UPDATE `user` SET `islogin`=#{islogin} WHERE id = #{userId}
</update>

2、自定义SessionLinstener,重写监听函数

自定义一个类ShiroSessionLinstener,继承SessionLinstenerAdapter类,同时重写监听函数

1)session创建时,输出sessionId,不进行任何操作

2)session停止时,输入sessionId和session存储的用户Id,不进行任何操作

3)session失效时,输入sessionId,重置对应的用户的登录状态为0

public class ShiroSessionListener extendsSessionListenerAdapter {

    @Resource
    privateUserService userService;

    //session创建
@Override
    public voidonStart(Session session) {
        super.onStart(session);
        System.out.println("session创建,sessionId:" +session.getId());
    }

    //session停止
@Override
    public voidonStop(Session session) {
        System.out.println("session停止,sessionId:" + session.getId() +",用户id:" + session.getAttribute("loginUserId"));
    }

    //session失效
@Override
    public voidonExpiration(Session session) {
        //重置登录状态
        userService.updateLoginStatus(session.getAttribute("loginUserId").toString(), LoginStatusEnum.NOT_LOGIN.getCode());
        System.out.println("session失效,sessionId:" + session.getId() +",用户id:" + session.getAttribute("loginUserId"));
    }

}

3、配置session监听及属性(均通过SessionManager进行配置)

1)使用setGlobalSessionTimeout(1800000L)设置session的过期时间为30分钟(可自定义)

2)使用setSessionValidationSchedulerEnabled(true)开启session检查

3)使用setSessionValidationInterval(15 * 60 * 1000L)设置检查间隔为15分钟

4)设置监听类为第2步自定义的类

Collection<SessionListener> listeners = new ArrayList<>();
listeners.add(shiroSessionListener());
sessionManager.setSessionListeners(listeners);

SpringBoot + Shiro实现当前在线人数统计第1张

最后不要忘记把SessionManager配置到ShiroConfig中

4、编写查询函数查询在线人数

/**获取在线人数 */Integer getLoginCount();
<select   resultType="java.lang.Integer">SELECT count(1) FROM `user` WHERE `is_login` = 1
</select>

免责声明:文章转载自《SpringBoot + Shiro实现当前在线人数统计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇crontab的语法规则格式(每分钟、每小时、每天、每周、每月、每年定时执行 规则)React Native拆包及热更新方案 · Solartisan下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL8.0新增配置参数

activate_all_roles_on_login 此参数在版本8.0.2引入,是一个可以动态调整的global级参数,默认值为OFF。此参数用于控制在账户登录时是否激活已经授予的角色,如果为ON则授予的角色会被激活,设置为OFF时只能通过SET DEFAULT ROLE显式激活用户角色。activate_all_roles_on_login设置只在账...

oracle数据库SQL收集整理

oralce数据库导入及导出某用户所有数据 前提:在CMD 命令下 导出命令:exp 用户名/密码@数据库 owner=用户名 file=文件存储路径(如:F:abcd.dmp) 导出服务器数据:exp sname/paw@192.60.25.102/orcl owner=sname file=d:sname.dmp 导入命令:imp 用户名/密码@数据库...

分布式下Session一致性问题

一、Session一致性问题 1.1 什么是Session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(sessionId),通过cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉web服务器请求是属于哪...

twig一些常用的用法总结【原创】

在使用Symphony项目时,需要一些常用的twig,经过自己做的几个项目,自己的总结如下: 一、twig-数据判断 有时候在使用后台传给前台数据时需要判断是否有这个值,(是否为空(”或null)或是否定义defined或is empty) 例如: 多维数组时: {% if item.image is defined %} <div class=”...

jQuery+Ajax用户登录功能的实现

前几天把jbox源码修改成仿QQ空间模拟窗口后发现有很多人在关注。今天就贴一下我利用该模拟窗口实现的用户登录功能的代码。ok,先来贴几张张效果图。   其中大致流程是用户点击页面右上角的登录链接接着弹出div模拟窗口,该窗口通过iframe调用Login.aspx页面,用户输入用户名 密码和验证码后,Login.aspx页面的jQuery代码post到L...

Nginx+Tomcat 集群部署

1.Nginx + Tomcat 集群部署 简单配置 1 #user nobody; 2 worker_processes 4;#工作进程的个数 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log inf...