Springboot+jwt實現(xiàn)在線用戶功能(示例代碼)
更新時間:2024年12月23日 09:51:55 作者:修羅-zero
這篇文章主要介紹了Springboot+jwt實現(xiàn)在線用戶功能,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
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){
//獲取當(dāng)前時間(毫秒)
//解析token
String userId = TokenUtil.getUserId(token);
countMap.put(userId,token);
}
/*
* 獲取當(dāng)前在線總數(shù)
* */
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;
}
/*
* 獲取當(dāng)前在線用戶列表
* */
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.定義一個攔截器,主要在驗證通過攔截器的時候調(diào)用上面的方法插入一個新用戶
@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業(yè)務(wù)邏輯代碼。。。。。。
//記錄在線人員
onlineCounter.insertUser(userId);
return true;
}
}
}

工具類需要新增方法用于判斷當(dāng)前token是否過期
/*
* 根據(jù)token判斷是否過期
* */
public static boolean hasExpiresAt(String token){
//創(chuàng)建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();//獲取過期時間與當(dāng)前時間的時間差(毫秒)
System.out.println("過期時間與當(dāng)前時間的時間差(毫秒):"+diffTime);
if(diffTime < 0){
//已過期
return true;
}else{
//未過期
return false;
}
}catch (Exception e){
return true;
}
}3.定義個控制器 獲取在線人員數(shù)量OnlineController
@ApiController(value = "/sys/online")
public class OnlineController {
@Autowired
private OnlineCounter onlineCounter;
/**
* 獲取當(dāng)前用戶在線人數(shù)
*
* @return
*/
@GetMapping(value = "/getOnlineCount")
public int getRealOnlineCount() {
Integer onlines = onlineCounter.getOnlineCount();
return onlines;
}
}
調(diào)用接口,結(jié)果如下:

到此這篇關(guān)于Springboot+jwt實現(xiàn)在線用戶功能的文章就介紹到這了,更多相關(guān)Springboot jwt在線用戶內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你如何將Springboot項目成功部署到linux服務(wù)器
這篇文章主要介紹了如何將Springboot項目成功部署到linux服務(wù)器上,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
詳解springboot接口如何優(yōu)雅的接收時間類型參數(shù)
這篇文章主要為大家詳細(xì)介紹了springboot的接口如何優(yōu)雅的接收時間類型參數(shù),文中為大家整理了三種常見的方法,希望對大家有一定的幫助2023-09-09

