package com.sandu.common.redis.online; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentInfo; import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.sandu.common.redis.RedisService; import com.sandu.common.security.config.SecurityProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; /** * @author chenjiantian * @date 2021/8/6 16:26 * 在线用户服务类 * 在 BaseRedisConfig 注入 */ @Slf4j public class OnlineUserService { private final SecurityProperties properties; private final RedisService redisService; public OnlineUserService(SecurityProperties properties, RedisService redisService) { this.properties = properties; this.redisService = redisService; } /** * 保存在线用户信息 */ public void save(UserDetails userDetails, String token, Long userId,HttpServletRequest request) { String ip = ServletUtil.getClientIP(request); UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); String browser = Optional.ofNullable(userAgent).map(UserAgent::getBrowser).map(UserAgentInfo::getName).orElse(""); OnlineUser onlineUser = new OnlineUser(userId,userDetails.getUsername(), token, ip, browser, LocalDateTime.now()); // redisService.set(properties.getOnlineKey() + token, onlineUser, properties.getTokenValidityInSeconds() / 1000); redisService.set(properties.getOnlineKey() + userDetails.getUsername(), onlineUser); } /** * 查询全部数据 * * @param filter * @return */ public List getAll(String filter) { Set keys = redisService.keys(properties.getOnlineKey() + "*"); List onlineUsers = new ArrayList<>(); for (String key : keys) { OnlineUser onlineUser = (OnlineUser) redisService.get(key); if (StringUtils.isNotBlank(filter)) { if (onlineUser.toString().contains(filter)) { onlineUsers.add(onlineUser); } } else { onlineUsers.add(onlineUser); } } onlineUsers.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); return onlineUsers; } private boolean kickOut(String token) throws Exception { token = properties.getOnlineKey() + token; return redisService.del(token); } public OnlineUser getOne(String key) { return (OnlineUser) redisService.get(key); } /** * 检测用户是否在之前已经登录,已经登录踢下线 * * @param userName 用户名 */ public void checkLoginOnUser(String userName, String ignoreToken) { // List onlineUsers = getAll(userName); // if (onlineUsers == null || onlineUsers.isEmpty()) { // return; // } OnlineUser onlineUser = getOne(properties.getOnlineKey() + userName); if(onlineUser == null){ return; } // for (OnlineUser onlineUser : onlineUsers) { if (onlineUser.getUserName().equals(userName)) { try { String token = onlineUser.getToken(); if (StringUtils.isNotBlank(ignoreToken) && !ignoreToken.equals(token)) { this.kickOut(token); } else if (StringUtils.isBlank(ignoreToken)) { this.kickOut(token); } } catch (Exception e) { log.error("checkUser is error", e); } } // } } public void updateOne(OnlineUser onlineUser) { redisService.set(properties.getOnlineKey() + onlineUser.getUserName(), onlineUser); } }