| | |
| | | //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<OnlineUser> getAll(String filter) { |
| | | // Set<String> keys = redisService.keys(properties.getOnlineKey() + "*"); |
| | | // |
| | | // List<OnlineUser> 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<OnlineUser> onlineUsers = getAll(userName); |
| | | //// if (onlineUsers == null || onlineUsers.isEmpty()) { |
| | | //// return; |
| | | //// } |
| | | // OnlineUser onlineUser = getOne(properties.getOnlineKey() + userName); |
| | | // if(onlineUser == null){ |
| | | 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<OnlineUser> getAll(String filter) { |
| | | Set<String> keys = redisService.keys(properties.getOnlineKey() + "*"); |
| | | |
| | | List<OnlineUser> 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<OnlineUser> onlineUsers = getAll(userName); |
| | | // if (onlineUsers == null || onlineUsers.isEmpty()) { |
| | | // 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); |
| | | // } |
| | | //} |
| | | 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); |
| | | } |
| | | } |