2021与蓝度共同重构项目,服务端
liuhaonan
2022-01-18 51b53373d150e4107a51fcf502d0598b7d82c455
sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java
@@ -1,115 +1,115 @@
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()) {
//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){
//            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);
    }
}
////        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);
//    }
//}