chejianzheng 3 місяців тому
батько
коміт
cc660c64be

+ 4 - 2
src/main/java/cn/hfln/framework/gateway/componet/GatewayLogFilter.java

@@ -20,14 +20,16 @@ public class GatewayLogFilter implements GlobalFilter, Ordered {
         ServerHttpRequest request = exchange.getRequest();
         
         // 打印请求日志(转发前)
+        long start = System.currentTimeMillis();
         log.info("[Gateway] Request => Method: {}, Path: {}",
                 request.getMethod(), 
                 request.getPath());
 
         return chain.filter(exchange).then(Mono.fromRunnable(() -> {
             // 打印响应日志(转发后)
-            log.info("[Gateway] Response => Status: {}",
-                    exchange.getResponse().getStatusCode());
+            log.info("[Gateway] Response => Status: {}, cost: {}ms",
+                    exchange.getResponse().getStatusCode(),
+                    System.currentTimeMillis() - start);
         }));
     }
 

+ 0 - 44
src/main/java/cn/hfln/framework/gateway/config/FastJson2JsonRedisSerializer.java

@@ -1,44 +0,0 @@
-//package cn.hfln.framework.gateway.config;
-//
-//import com.alibaba.fastjson2.JSON;
-//import com.alibaba.fastjson2.JSONReader;
-//import com.alibaba.fastjson2.JSONWriter;
-//import org.springframework.data.redis.serializer.RedisSerializer;
-//import org.springframework.data.redis.serializer.SerializationException;
-//
-//import java.nio.charset.Charset;
-//
-///**
-// * Redis使用FastJson序列化
-// *
-// * @author cw
-// */
-//public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
-//    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
-//
-//    private Class<T> clazz;
-//
-//
-//    public FastJson2JsonRedisSerializer(Class<T> clazz) {
-//        super();
-//        this.clazz = clazz;
-//    }
-//
-//    @Override
-//    public byte[] serialize(T t) throws SerializationException {
-//        if (t == null) {
-//            return new byte[0];
-//        }
-//        return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
-//    }
-//
-//    @Override
-//    public T deserialize(byte[] bytes) throws SerializationException {
-//        if (bytes == null || bytes.length <= 0) {
-//            return null;
-//        }
-//        String str = new String(bytes, DEFAULT_CHARSET);
-//
-//        return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
-//    }
-//}

+ 0 - 20
src/main/java/cn/hfln/framework/gateway/config/IgnoreUrlsConfig.java

@@ -1,20 +0,0 @@
-//package cn.hfln.framework.gateway.config;
-//
-//import lombok.Data;
-//import lombok.EqualsAndHashCode;
-//import org.springframework.boot.context.properties.ConfigurationProperties;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.List;
-//
-///**
-// * @USER: YangLiu
-// * 网关白名单配置
-// */
-//@Data
-//@EqualsAndHashCode(callSuper = false)
-//@Component
-//@ConfigurationProperties(prefix="secure.ignore")
-//public class IgnoreUrlsConfig {
-//    private List<String> urls;
-//}

+ 0 - 355
src/main/java/cn/hfln/framework/gateway/config/RedisService.java

@@ -1,355 +0,0 @@
-//package cn.hfln.framework.gateway.config;
-//
-//import cn.hutool.core.util.RandomUtil;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.CommandLineRunner;
-//import org.springframework.data.redis.core.BoundSetOperations;
-//import org.springframework.data.redis.core.HashOperations;
-//import org.springframework.data.redis.core.RedisTemplate;
-//import org.springframework.data.redis.core.ValueOperations;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.*;
-//import java.util.concurrent.TimeUnit;
-//
-///**
-// * spring redis 工具类
-// *
-// * @author cw
-// **/
-//@SuppressWarnings(value = {"unchecked", "rawtypes"})
-//@Component
-//public class RedisService implements CommandLineRunner {
-//    @Autowired
-//    public RedisTemplate redisTemplate;
-//
-//    /**
-//     * 缓存基本的对象,Integer、String、实体类等
-//     *
-//     * @param key   缓存的键值
-//     * @param value 缓存的值
-//     */
-//    public <T> void setCacheObject(final String key, final T value) {
-//        redisTemplate.opsForValue().set(key, value);
-//    }
-//
-//    /**
-//     * 分布式锁
-//     *
-//     * @param key
-//     * @param value
-//     * @return
-//     */
-//    public boolean setNx(final String key, String value) {
-//        return redisTemplate.opsForValue().setIfAbsent(key, value);
-//    }
-//
-//    /**
-//     * 分布式锁
-//     *
-//     * @param key
-//     * @param value
-//     * @return
-//     */
-//    public boolean setNx(final String key, String value, final Long timeout, final TimeUnit timeUnit) {
-//        return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
-//    }
-//
-//    /**
-//     * 缓存基本的对象,Integer、String、实体类等
-//     *
-//     * @param key      缓存的键值
-//     * @param value    缓存的值
-//     * @param timeout  时间
-//     * @param timeUnit 时间颗粒度
-//     */
-//    public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) {
-//        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
-//    }
-//
-//    /**
-//     * 设置有效时间
-//     *
-//     * @param key Redis键
-//     * @param timeout 超时时间
-//     * @return true=设置成功;false=设置失败
-//     */
-//    public boolean expire(final String key, final long timeout)
-//    {
-//        return expire(key, timeout, TimeUnit.SECONDS);
-//    }
-//
-//    /**
-//     * 设置有效时间
-//     *
-//     * @param key Redis键
-//     * @param timeout 超时时间
-//     * @param unit 时间单位
-//     * @return true=设置成功;false=设置失败
-//     */
-//    public boolean expire(final String key, final long timeout, final TimeUnit unit)
-//    {
-//        return redisTemplate.expire(key, timeout, unit);
-//    }
-//
-//    /**
-//     * 获取有效时间
-//     *
-//     * @param key Redis键
-//     * @return 有效时间
-//     */
-//    public long getExpire(final String key)
-//    {
-//        return redisTemplate.getExpire(key);
-//    }
-//
-//    /**
-//     * 判断 key是否存在
-//     *
-//     * @param key 键
-//     * @return true 存在 false不存在
-//     */
-//    public Boolean hasKey(String key)
-//    {
-//        return redisTemplate.hasKey(key);
-//    }
-//
-//    /**
-//     * 获得缓存的基本对象。
-//     *
-//     * @param key 缓存键值
-//     * @return 缓存键值对应的数据
-//     */
-//    public <T> T getCacheObject(final String key)
-//    {
-//        ValueOperations<String, T> operation = redisTemplate.opsForValue();
-//        return operation.get(key);
-//    }
-//
-//    /**
-//     * 获得缓存的基本对象。
-//     *
-//     * @param key 缓存键值
-//     * @return 缓存键值对应的数据
-//     */
-//    public Long increment(final String key) {
-//        return redisTemplate.opsForValue().increment(key);
-//    }
-//
-//    public Long incrementMap(String key, String filed) {
-//        return redisTemplate.opsForHash().increment(key, filed, 1L);
-//    }
-//
-//    /**
-//     * 删除单个对象
-//     *
-//     * @param key
-//     */
-//    public boolean deleteObject(final String key) {
-//        return redisTemplate.delete(key);
-//    }
-//
-//    /**
-//     * 删除集合对象
-//     *
-//     * @param collection 多个对象
-//     * @return
-//     */
-//    public boolean deleteObject(final Collection collection)
-//    {
-//        return redisTemplate.delete(collection) > 0;
-//    }
-//
-//    /**
-//     * 缓存List数据
-//     *
-//     * @param key 缓存的键值
-//     * @param dataList 待缓存的List数据
-//     * @return 缓存的对象
-//     */
-//    public <T> long setCacheList(final String key, final List<T> dataList)
-//    {
-//        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
-//        return count == null ? 0 : count;
-//    }
-//    /**
-//     * 获得缓存的基本对象列表
-//     *
-//     * @param pattern 字符串前缀
-//     * @return 对象列表
-//     */
-//    public Collection<String> keys(final String pattern)
-//    {
-//        return redisTemplate.keys(pattern);
-//    }
-//    /**
-//     * 获得缓存的list对象
-//     *
-//     * @param key 缓存的键值
-//     * @return 缓存键值对应的数据
-//     */
-//    public <T> List<T> getCacheList(final String key)
-//    {
-//        return redisTemplate.opsForList().range(key, 0, -1);
-//    }
-//
-//    /**
-//     * 缓存Set
-//     *
-//     * @param key 缓存键值
-//     * @param dataSet 缓存的数据
-//     * @return 缓存数据的对象
-//     */
-//    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
-//    {
-//        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
-//        Iterator<T> it = dataSet.iterator();
-//        while (it.hasNext())
-//        {
-//            setOperation.add(it.next());
-//        }
-//        return setOperation;
-//    }
-//
-//    /**
-//     * 获得缓存的set
-//     *
-//     * @param key
-//     * @return
-//     */
-//    public <T> Set<T> getCacheSet(final String key)
-//    {
-//        return redisTemplate.opsForSet().members(key);
-//    }
-//
-//    /**
-//     * 添加元素缓存的set
-//     * @param key
-//     * @param values
-//     * @return
-//     * @param <T>
-//     */
-//    public <T> Long addCacheSet(final String key, final T... values)
-//    {
-//        return redisTemplate.opsForSet().add(key, values);
-//    }
-//
-//    /**
-//     * 删除缓存set的元素
-//     * @param key
-//     * @param values
-//     * @return
-//     * @param <T>
-//     */
-//    public <T> Long removeCacheSet(final String key, final T... values)
-//    {
-//        return redisTemplate.opsForSet().remove(key, values);
-//    }
-//
-//    /**
-//     * 缓存的set的size
-//     * @param key
-//     * @return
-//     * @param <T>
-//     */
-//    public <T> Long size(final String key)
-//    {
-//        return redisTemplate.opsForSet().size(key);
-//    }
-//
-//    /**
-//     * set是否包含value
-//     * @param key
-//     * @param object
-//     * @return
-//     */
-//    public Boolean isMember(final String key, final Object object)
-//    {
-//        return redisTemplate.opsForSet().isMember(key, object);
-//    }
-//
-//    /**
-//     * 缓存Map
-//     *
-//     * @param key
-//     * @param dataMap
-//     */
-//    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
-//    {
-//        if (dataMap != null) {
-//            redisTemplate.opsForHash().putAll(key, dataMap);
-//        }
-//    }
-//
-//    /**
-//     * 获得缓存的Map
-//     *
-//     * @param key
-//     * @return
-//     */
-//    public <T> Map<String, T> getCacheMap(final String key)
-//    {
-//        return redisTemplate.opsForHash().entries(key);
-//    }
-//
-//    /**
-//     * 往Hash中存入数据
-//     *
-//     * @param key Redis键
-//     * @param hKey Hash键
-//     * @param value 值
-//     */
-//    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
-//    {
-//        redisTemplate.opsForHash().put(key, hKey, value);
-//    }
-//
-//    /**
-//     * 获取Hash中的数据
-//     *
-//     * @param key Redis键
-//     * @param hKey Hash键
-//     * @return Hash中的对象
-//     */
-//    public <T> T getCacheMapValue(final String key, final String hKey)
-//    {
-//        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
-//        return opsForHash.get(key, hKey);
-//    }
-//
-//
-//    /**
-//     * 获取多个Hash中的数据
-//     *
-//     * @param key Redis键
-//     * @param hKeys Hash键集合
-//     * @return Hash对象集合
-//     */
-//    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
-//    {
-//        return redisTemplate.opsForHash().multiGet(key, hKeys);
-//    }
-//
-//    /**
-//     * 删除Hash中的某条数据
-//     *
-//     * @param key  Redis键
-//     * @param hKey Hash键
-//     * @return 是否成功
-//     */
-//    public boolean deleteCacheMapValue(final String key, final String hKey) {
-//        return redisTemplate.opsForHash().delete(key, hKey) > 0;
-//    }
-//
-//    @Override
-//    public void run(String... args) throws Exception {
-//        redisTemplate.opsForValue().set("test", RandomUtil.randomString(2));
-//    }
-//
-//    /**
-//     * 获得缓存的基本对象列表
-//     *
-//     * @param pattern 字符串前缀
-//     * @return 对象列表
-//     */
-//}

+ 0 - 0
src/main/java/cn/hfln/framework/gateway/config/ResourceServerConfig.java


+ 9 - 12
src/main/java/cn/hfln/framework/gateway/config/StpInterfaceImpl.java

@@ -1,18 +1,15 @@
 package cn.hfln.framework.gateway.config;
 
 import cn.dev33.satoken.stp.StpInterface;
-
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hfln.framework.redis.util.RedisUtil;
+import com.alibaba.fastjson2.JSONArray;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * 自定义权限认证接口扩展,Sa-Token 将从此实现类获取每个账号拥有的权限码
@@ -33,16 +30,16 @@ public class StpInterfaceImpl implements StpInterface {
 	@Override
 	public List<String> getPermissionList(Object loginIdObj, String loginType) {
 
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		List<String> roleList = this.getRoleList(loginIdObj, loginType);
 		for (String roleCode : roleList) {
 			String rolePermKeyPre = "hfln:perm:";
-			Set<String> permList = (Set<String>)(Set<?>) redisService.sMembers(rolePermKeyPre + roleCode);
-			if (CollectionUtils.isEmpty(permList)) {
+			String permListStr = (String)redisService.get(rolePermKeyPre + roleCode);
+			if (!StringUtils.hasText(permListStr)) {
 				log.info("当前角色未配置权限, roleCode :{}", roleCode);
 				continue;
 			}
-			list.addAll(permList);
+			list.addAll(JSONArray.parseArray(permListStr, String.class));
 		}
 		return list;
 	}
@@ -55,12 +52,12 @@ public class StpInterfaceImpl implements StpInterface {
 
 		// 当前登录用户的角色
 		String roleKeyPre = "hfln:role:";
-		Set<String> roleList = (Set<String>)(Set<?>)redisService.sMembers(roleKeyPre + loginIdObj);
-		if (CollectionUtils.isEmpty(roleList)) {
+		String roleListStr = (String)redisService.get(roleKeyPre + loginIdObj);
+		if (!StringUtils.hasText(roleListStr)) {
 			log.info("当前账户未配置角色, loginId :{}", loginIdObj);
 			return new ArrayList<>();
 		}
-		return new ArrayList<>(roleList);
+		return new ArrayList<>(JSONArray.parseArray(roleListStr, String.class));
 	}
 
 }