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;
|
}
|
// 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);
|
}
|
}
|