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在线用户内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis动态SQL实现配置过程解析

    MyBatis动态SQL实现配置过程解析

    这篇文章主要介绍了MyBatis动态SQL实现配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot整合第三方技术的实现

    SpringBoot整合第三方技术的实现

    本文主要介绍了SpringBoot整合第三方技术的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • hibernate中HQL如何调用自定义函数

    hibernate中HQL如何调用自定义函数

    这篇文章主要介绍了hibernate中HQL如何调用自定义函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • springcloud LogBack日志使用详解

    springcloud LogBack日志使用详解

    这篇文章主要介绍了springcloud LogBack日志使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java开发实现订阅到货通知帮我们买到想买的东西

    java开发实现订阅到货通知帮我们买到想买的东西

    这篇文章主要为大家介绍了java开发实现订阅到货通知帮我们买到想买的东西示例demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • SpringBoot+SpringSecurity实现基于真实数据的授权认证

    SpringBoot+SpringSecurity实现基于真实数据的授权认证

    Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,Spring Security主要做两个事情,认证、授权。这篇文章主要介绍了SpringBoot+SpringSecurity实现基于真实数据的授权认证,需要的朋友可以参考下
    2021-05-05
  • java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解

    这篇文章主要介绍了java算法之二分查找法的实例详解的相关资料,这里提供简单实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • Java实现布隆过滤器的方法步骤

    Java实现布隆过滤器的方法步骤

    布隆过滤器是可以用于判断一个元素是不是在一个集合里,并且相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。下面这篇文章主要给大家介绍了关于Java实现布隆过滤器的相关资料,需要的朋友可以参考下
    2018-11-11
  • Flink JobGraph生成源码解析

    Flink JobGraph生成源码解析

    这篇文章主要为大家介绍了Flink JobGraph生成源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java和Rust实现JSON序列化互转的解决方案详解

    Java和Rust实现JSON序列化互转的解决方案详解

    这篇文章主要为大家详细介绍了Java和Rust实现JSON序列化互转的解决方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论