You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.7 KiB

package cn.soul2.jyjc.admin.bean;
import cn.soul2.jyjc.admin.entity.UserLoginOutDO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class UserLoginStatusBean {
private ConcurrentHashMap<String, UserLoginOutDO> loginStatusMap = new ConcurrentHashMap<>();
/**
* 缓存登录信息
*
* @param token token
* @param loginOutStatus 登录信息
*/
public void login(String token, UserLoginOutDO loginOutStatus) {
loginStatusMap.put(token, loginOutStatus);
}
/**
* 从缓存读取登录信息
*
* @param token token
* @return {@link UserLoginOutDO}
*/
public UserLoginOutDO getStatus(String token) {
UserLoginOutDO loginStatus = loginStatusMap.getOrDefault(token, null);
if (loginStatus.getLapseTime() != null) {
LocalDateTime now = LocalDateTime.now();
if (now.isAfter(loginStatus.getLapseTime())) {
logout(token);
return null;
}
}
return loginStatus;
}
/**
* 为key设置登出
*
* @param token token
* @return {@link Boolean}
*/
public Boolean logout(String token) {
if (StringUtils.isNotBlank(token) && loginStatusMap.containsKey(token)) {
UserLoginOutDO removedUser = loginStatusMap.remove(token);
// 返回true表示成功登出,返回false表示未成功登出
return removedUser != null;
}
return Boolean.TRUE;
}
public Boolean logoutByUserId(String userId) {
final String[] targetKey = {null};
loginStatusMap.forEach((k, v) -> {
if (targetKey[0] == null && v.getUserId().equals(userId)) {
targetKey[0] = k;
}
});
return logout(targetKey[0]);
}
public String getTokenByUsername(String username) {
final String[] token = {null};
loginStatusMap.forEach((k, v) -> {
if (token[0] == null && v.getUserName().equals(username)) {
token[0] = k;
}
});
return token[0];
}
public Boolean containsToken(String token) {
if (StringUtils.isBlank(token)) {
return Boolean.FALSE;
}
UserLoginOutDO loginStatus = loginStatusMap.getOrDefault(token, null);
if (loginStatus != null && loginStatus.getLapseTime() != null) {
LocalDateTime now = LocalDateTime.now();
if (now.isAfter(loginStatus.getLapseTime())) {
logout(token);
}
}
return loginStatusMap.containsKey(token);
}
}