处理多端登录问题

This commit is contained in:
TinyAnts 2022-09-15 19:04:26 +08:00
parent b550755d32
commit e1b6eaf2ba
4 changed files with 51 additions and 12 deletions

View File

@ -14,6 +14,9 @@ public class AdminConfig {
// 令牌缓存键 // 令牌缓存键
public static final String backstageTokenKey = "backstage:token:"; public static final String backstageTokenKey = "backstage:token:";
// 令牌的集合
public static final String backstageTokenSet = "backstage:token:set:";
// 免登录验证 // 免登录验证
public static String[] notLoginUri = new String[]{ public static String[] notLoginUri = new String[]{
"system:login", // 登录接口 "system:login", // 登录接口

View File

@ -44,7 +44,7 @@ class SystemAuthDeptServiceImpl implements ISystemAuthDeptService {
List<SystemAuthDept> systemAuthDeptList = systemAuthDeptMapper.selectList(new QueryWrapper<SystemAuthDept>() List<SystemAuthDept> systemAuthDeptList = systemAuthDeptMapper.selectList(new QueryWrapper<SystemAuthDept>()
.gt("pid", 0) .gt("pid", 0)
.eq("is_delete", 0) .eq("is_delete", 0)
.orderByDesc((Arrays.asList("id", "sort")))); .orderByDesc((Arrays.asList("sort", "id"))));
List<SystemAuthDeptVo> adminVoArrayList = new ArrayList<>(); List<SystemAuthDeptVo> adminVoArrayList = new ArrayList<>();
for (SystemAuthDept systemAuthDept : systemAuthDeptList) { for (SystemAuthDept systemAuthDept : systemAuthDeptList) {
@ -73,7 +73,7 @@ class SystemAuthDeptServiceImpl implements ISystemAuthDeptService {
queryWrapper.orderByAsc(Arrays.asList("sort", "id")); queryWrapper.orderByAsc(Arrays.asList("sort", "id"));
queryWrapper.select(SystemAuthDept.class, info -> queryWrapper.select(SystemAuthDept.class, info ->
!info.getColumn().equals("is_delete") && !info.getColumn().equals("is_delete") &&
!info.getColumn().equals("delete_time")); !info.getColumn().equals("delete_time"));
systemAuthDeptMapper.setSearch(queryWrapper, params, new String[]{ systemAuthDeptMapper.setSearch(queryWrapper, params, new String[]{
"like:name:str", "like:name:str",

View File

@ -19,9 +19,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.LinkedHashMap; import java.util.*;
import java.util.Map;
import java.util.Objects;
/** /**
* 系统登录服务实现类 * 系统登录服务实现类
@ -76,8 +74,18 @@ public class SystemLoginServiceImpl implements ISystemLoginService {
sysAdmin.setLastLoginTime(System.currentTimeMillis() / 1000); sysAdmin.setLastLoginTime(System.currentTimeMillis() / 1000);
systemAuthAdminMapper.updateById(sysAdmin); systemAuthAdminMapper.updateById(sysAdmin);
// 缓存登录信息 // 非多处登录
String token = ToolsUtil.makeToken(); String token = ToolsUtil.makeToken();
if (sysAdmin.getIsMultipoint() == 0) {
Set<Object> ts = RedisUtil.sGet(AdminConfig.backstageTokenSet + sysAdmin.getId());
for (Object t: ts) {
RedisUtil.del(t.toString());
}
RedisUtil.del(AdminConfig.backstageTokenSet + sysAdmin.getId());
RedisUtil.sSet(AdminConfig.backstageTokenSet + sysAdmin.getId(), token);
}
// 缓存登录信息
RedisUtil.set(AdminConfig.backstageTokenKey+token, sysAdmin.getId(), 7200); RedisUtil.set(AdminConfig.backstageTokenKey+token, sysAdmin.getId(), 7200);
iSystemAuthAdminService.cacheAdminUserByUid(sysAdmin.getId()); iSystemAuthAdminService.cacheAdminUserByUid(sysAdmin.getId());

View File

@ -1,15 +1,16 @@
package com.mdd.common.utils; package com.mdd.common.utils;
import com.mdd.common.config.GlobalConfig; import com.mdd.common.config.GlobalConfig;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Collection; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Component @Component
@ -180,6 +181,34 @@ public class RedisUtil {
/* ***************** common end *************** */ /* ***************** common end *************** */
/**
* 按匹配获取或有KEY
*
* @author fzr
* @param pattern 规则
* @return Set<String>
*/
public static Set<String> matchSet(String pattern) {
Set<String> keys = new LinkedHashSet<>();
RedisUtil.handler().execute((RedisConnection connection) -> {
try (Cursor<byte[]> cursor = connection.scan(
ScanOptions.scanOptions()
.count(Long.MAX_VALUE)
.match(pattern)
.build()
)) {
cursor.forEachRemaining(item -> {
keys.add(RedisSerializer.string().deserialize(item));
});
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
});
return keys;
}
/** /**
* 获取key的值 * 获取key的值
* *
@ -341,7 +370,6 @@ public class RedisUtil {
* @param key * @param key
* @param item * @param item
* @param value * @param value
* @return true 成功 false失败
*/ */
public static void hSet(String key, String item, Object value) { public static void hSet(String key, String item, Object value) {
key = redisPrefix + key; key = redisPrefix + key;
@ -455,7 +483,7 @@ public class RedisUtil {
* @param values 可以是多个 * @param values 可以是多个
* @return 成功个数 * @return 成功个数
*/ */
public Long sSet(String key, Object... values) { public static Long sSet(String key, Object... values) {
key = redisPrefix + key; key = redisPrefix + key;
return redisTemplate.opsForSet().add(key, values); return redisTemplate.opsForSet().add(key, values);
} }