Springboot+jwt实现在线用户功能(示例代码)

 更新时间:2024年12月23日 09:51:55   作者:修罗-zero  
这篇文章主要介绍了Springboot+jwt实现在线用户功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

1.定义OnlineCounter用于记录在线人员

package com.example.demo.config;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/*
* 在线用户
* */
@Component
public class OnlineCounter {
    private static Map countMap = new ConcurrentHashMap<String,Object>();
    public void insertToken(String token){
        //获取当前时间(毫秒)
        //解析token
        String userId = TokenUtil.getUserId(token);
        countMap.put(userId,token);
    }
    /*
    * 获取当前在线总数
    * */
    public Integer getOnlineCount(){
        int onlineCount = 0;
        //获取countMap的迭代器
        Iterator iterator = countMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String,Object> entry = (Map.Entry<String,Object>) iterator.next();
            String token = (String) entry.getValue();
            boolean flag = TokenUtil.hasExpiresAt(token);//返回true就是过期了
            if(flag){
                //移除
                countMap.remove(entry.getKey());
            }else{
                onlineCount++;
            }
        }
        return onlineCount;
    }
    /*
    * 获取当前在线用户列表
    * */
    public List<String> getOnlineUserList(){
        List<String> userIdList = new ArrayList<>();
        //获取countMap的迭代器
        Iterator iterator = countMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String,Object> entry = (Map.Entry<String,Object>) iterator.next();
            String token = (String) entry.getValue();
            boolean flag = TokenUtil.hasExpiresAt(token);//返回true就是过期了
            if(flag){
                //移除
                countMap.remove(entry.getKey());
            }else{
                userIdList.add(entry.getKey());
            }
        }
        return userIdList;
    }
}

2.定义一个拦截器,主要在验证通过拦截器的时候调用上面的方法插入一个新用户

@component
public class JWTInterceptor implements HandlerInterception{
    @Autowired
    private OnlineCounter onlineCounter;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) {
            return true;
        } else {
			//jwt业务逻辑代码。。。。。。           
			//记录在线人员
            onlineCounter.insertUser(userId);
            return true;
        }
    }
}

工具类需要新增方法用于判断当前token是否过期

/*
    * 根据token判断是否过期
    * */
    public static boolean hasExpiresAt(String token){
        //创建token验证器
        try{
            JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            DecodedJWT decodedJWT=jwtVerifier.verify(token);
            Date timeoutDate = decodedJWT.getExpiresAt();//获取过期时间
            long diffTime = timeoutDate.getTime() - new Date().getTime();//获取过期时间与当前时间的时间差(毫秒)
            System.out.println("过期时间与当前时间的时间差(毫秒):"+diffTime);
            if(diffTime < 0){
                //已过期
                return true;
            }else{
                //未过期
                return false;
            }
        }catch (Exception e){
            return true;
        }
    }

3.定义个控制器 获取在线人员数量OnlineController

@ApiController(value = "/sys/online")
public class OnlineController {
    @Autowired
    private OnlineCounter onlineCounter;
    /**
     * 获取当前用户在线人数
     *
     * @return
     */
    @GetMapping(value = "/getOnlineCount")
    public int getRealOnlineCount() {
        Integer onlines = onlineCounter.getOnlineCount();
        return onlines;
    }
}

调用接口,结果如下:

到此这篇关于Springboot+jwt实现在线用户功能的文章就介绍到这了,更多相关Springboot jwt在线用户内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java开发中常用记录

    Java开发中常用记录

    这篇文章主要介绍了Java-编程式事务、Java-Stream、Linux常用命令,需要的朋友可以参考下
    2023-05-05
  • 教你如何将Springboot项目成功部署到linux服务器

    教你如何将Springboot项目成功部署到linux服务器

    这篇文章主要介绍了如何将Springboot项目成功部署到linux服务器上,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Java实现的日历功能完整示例

    Java实现的日历功能完整示例

    这篇文章主要介绍了Java实现的日历功能,结合完整实例形式分析了Java日历功能相关的日期时间获取、计算、显示等操作技巧,需要的朋友可以参考下
    2019-02-02
  • 使用自定义注解实现redisson分布式锁

    使用自定义注解实现redisson分布式锁

    这篇文章主要介绍了使用自定义注解实现redisson分布式锁,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java实现简单汽车租赁系统

    java实现简单汽车租赁系统

    这篇文章主要为大家详细介绍了java实现简单汽车租赁系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 深入了解Java语言中的并发性选项有何不同

    深入了解Java语言中的并发性选项有何不同

    这篇文章主要介绍了深入了解Java语言中的并发性选项有何不同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • 详解JAVA里面获取map的key和value的方法

    详解JAVA里面获取map的key和value的方法

    这篇文章主要介绍了详解JAVA里面获取map的key和value的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 基于Spring实现文件上传功能

    基于Spring实现文件上传功能

    这篇文章主要为大家详细介绍了Spring实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • SpringBoot如何配置tomcat access日志

    SpringBoot如何配置tomcat access日志

    access日志记录了每一个HTTP请求的信息,包括请求的来源、请求的资源、响应状态码等,常常用来做数据统计、性能监控,比如通过分析访问日志,可以发现性能瓶颈和优化机会,提升应用的响应速度等,这篇文章主要介绍了SpringBoot配置tomcat access日志,需要的朋友可以参考下
    2024-05-05
  • 详解springboot接口如何优雅的接收时间类型参数

    详解springboot接口如何优雅的接收时间类型参数

    这篇文章主要为大家详细介绍了springboot的接口如何优雅的接收时间类型参数,文中为大家整理了三种常见的方法,希望对大家有一定的帮助
    2023-09-09

最新评论