From 80247f1b5e00fab2ce6c9e8474cfeceefb902d95 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期三, 23 七月 2025 15:39:17 +0800 Subject: [PATCH] 解决Redis键乱码 --- se-common/src/main/java/com/terra/common/entity/lf/UserPo.java | 5 se-common/src/main/java/com/terra/common/config/RedisConfig.java | 27 +-- se-common/src/main/java/com/terra/common/service/CommonService.java | 10 se-common/src/main/java/com/terra/common/entity/all/FastJson2JsonRedisSerializer.java | 44 +++++++ se-common/pom.xml | 6 + se-common/src/main/java/com/terra/common/config/WebConfig.java | 125 ++++++++++++++++++++ se-common/src/main/java/com/terra/common/entity/lf/TokenPo.java | 5 se-common/src/main/java/com/terra/common/aspect/LogAspect.java | 18 ++ se-common/src/main/java/com/terra/common/mapper/CommonMapper.java | 2 se-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 11 + se-common/src/main/java/com/terra/common/interceptor/AuthInterceptor.java | 40 +++-- se-system/src/main/java/com/terra/system/config/WebConfig.java | 9 12 files changed, 251 insertions(+), 51 deletions(-) diff --git a/se-common/pom.xml b/se-common/pom.xml index 68f6064..702a45d 100644 --- a/se-common/pom.xml +++ b/se-common/pom.xml @@ -35,6 +35,12 @@ <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> + <version>${fastjson.version}</version> + </dependency> + <dependency> + <groupId>com.alibaba.fastjson2</groupId> + <artifactId>fastjson2-extension-spring5</artifactId> + <version>${fastjson.version}</version> </dependency> <!--servlet--> diff --git a/se-common/src/main/java/com/terra/common/aspect/LogAspect.java b/se-common/src/main/java/com/terra/common/aspect/LogAspect.java index 7a60693..a7262f7 100644 --- a/se-common/src/main/java/com/terra/common/aspect/LogAspect.java +++ b/se-common/src/main/java/com/terra/common/aspect/LogAspect.java @@ -2,9 +2,10 @@ import com.terra.common.annotation.SysLog; import com.terra.common.entity.lf.OperatePo; -import com.terra.common.service.TokenHelper; +import com.terra.common.entity.lf.UserPo; +import com.terra.common.service.CommonService; import com.terra.common.helper.WebHelper; -import com.terra.common.mapper.OperatePoMapper; +import com.terra.common.mapper.CommonMapper; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -27,7 +28,10 @@ @Component public class LogAspect { @Resource - OperatePoMapper operatePoMapper; + CommonMapper commonMapper; + + @Resource + CommonService commonService; private final static String SELECT = "select"; @@ -85,7 +89,11 @@ po.setUrl(req.getServletPath()); po.setIp(WebHelper.getIpAddress(req)); po.setExec(time); - po.setUserid(TokenHelper.getCurrentUserId(req)); + + UserPo user = commonService.getCurrentUser(req); + if (null != user) { + po.setUserid(user.getId()); + } // 璁剧疆妯″潡 Tag tag = clazz.getAnnotation(Tag.class); @@ -105,7 +113,7 @@ po.setBak(sysLog.value()); } - operatePoMapper.insert(po); + commonMapper.insert(po); } catch (Exception ex) { log.error(ex.getMessage(), ex); } diff --git a/se-common/src/main/java/com/terra/common/config/RedisConfig.java b/se-common/src/main/java/com/terra/common/config/RedisConfig.java index b913026..7a4301b 100644 --- a/se-common/src/main/java/com/terra/common/config/RedisConfig.java +++ b/se-common/src/main/java/com/terra/common/config/RedisConfig.java @@ -3,7 +3,9 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.terra.common.entity.all.FastJson2JsonRedisSerializer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.Cache; import org.springframework.cache.annotation.CachingConfigurerSupport; @@ -23,31 +25,24 @@ * @author WWW */ @Configuration -@AutoConfigureAfter(RedisAutoConfiguration.class) +@SuppressWarnings("ALL") +@AutoConfigureBefore(RedisAutoConfiguration.class) public class RedisConfig extends CachingConfigurerSupport { /** * 閰嶇疆鑷畾涔塺edisTemplate */ - @SuppressWarnings("deprecation") @Bean - public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); - template.setConnectionFactory(redisConnectionFactory); + template.setConnectionFactory(factory); - // 浣跨敤Jackson2JsonRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨剉alue鍊� - Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class); + //Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); - serializer.setObjectMapper(mapper); - - template.setValueSerializer(serializer); - - //浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊� template.setKeySerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(serializer); + //template.setValueSerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); template.afterPropertiesSet(); return template; diff --git a/se-common/src/main/java/com/terra/common/config/WebConfig.java b/se-common/src/main/java/com/terra/common/config/WebConfig.java new file mode 100644 index 0000000..077efc6 --- /dev/null +++ b/se-common/src/main/java/com/terra/common/config/WebConfig.java @@ -0,0 +1,125 @@ +package com.terra.common.config; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.support.config.FastJsonConfig; +import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter; + +import com.terra.common.interceptor.AuthInterceptor; +import com.terra.common.service.CommonService; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.config.annotation.*; + +import javax.annotation.Resource; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; + +/** + * WebConfig锛氶�氳繃瀹炵幇璇ユ帴鍙e苟閲嶅啓鏂规硶鏉モ�屾墿灞曗�孲pring MVC閰嶇疆锛屼笉浼氳鐩栭粯璁ら厤缃�� + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Resource + CommonService commonService; + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + // 璁剧疆璁块棶璺緞涓� 鈥�/鈥� 璺宠浆鍒版寚瀹氶〉闈� + registry.addViewController("/").setViewName("redirect:/sign/toIndex"); + // 璁剧疆涓烘渶楂樹紭鍏堢骇 + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + } + + /** + * 鑾峰彇鎷︽埅鍣ㄥ璞� + */ + public AuthInterceptor getAuthBean() { + return new AuthInterceptor(commonService); + } + + /** + * swagger鎺у埗 + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + //registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + registry.addResourceHandler("/druid/**").addResourceLocations("classpath:/META-INF/resources/druid/"); + registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); + } + + /** + * 蹇界暐url鍦板潃澶у皬鍐� + */ + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + AntPathMatcher matcher = new AntPathMatcher(); + matcher.setCaseSensitive(false); + + configurer.setPathMatcher(matcher); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(getAuthBean()) + //.excludePathPatterns("/v3/api-docs") + .addPathPatterns("/**"); + } + + /** + * 澶勭悊json鏍煎紡锛屽�糿ull鐨勮浆鎹负"" + */ + @Override + public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { + //FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter() { + @Override + protected void writeInternal(Object object, org.springframework.http.HttpOutputMessage outputMessage) + throws IOException, org.springframework.http.converter.HttpMessageNotWritableException { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes != null) { + String requestURI = attributes.getRequest().getRequestURI(); + if ("/v3/api-docs".equals(requestURI)) { // 鎺掗櫎 /v3/api-docs 璺緞 + // 浣跨敤榛樿鐨� JSON 搴忓垪鍖栵紙濡� Jackson锛夛紝杩欓噷闇�瑕佹墜鍔ㄥ鐞嗭紝涓嶈兘鐩存帴璋冪敤 super.writeInternal + outputMessage.getBody().write(String.valueOf(object).getBytes()); + return; + } + } + super.writeInternal(object, outputMessage); // 鍏朵粬璺緞浣跨敤 Fastjson2 澶勭悊 + } + }; + converter.setFastJsonConfig(getFastJsonConfig()); + converter.setDefaultCharset(StandardCharsets.UTF_8); + converter.setSupportedMediaTypes(Collections.singletonList( + MediaType.APPLICATION_JSON + )); + converters.add(0, converter); + } + + private static FastJsonConfig getFastJsonConfig() { + FastJsonConfig config = new FastJsonConfig(); + // 閰嶇疆搴忓垪鍖栫壒寰� + config.setWriterFeatures( + JSONWriter.Feature.WriteNullListAsEmpty, + //JSONWriter.Feature.WriteNullBooleanAsFalse, + //JSONWriter.Feature.WriteNullNumberAsZero, + //JSONWriter.Feature.PrettyFormat, // 鏍煎紡鍖栬緭鍑� + JSONWriter.Feature.WriteMapNullValue // 杈撳嚭绌哄瓧娈� + ); + // 鍙嶅簭鍒楀寲鐗规�ч厤缃� + config.setReaderFeatures( + JSONReader.Feature.FieldBased, + JSONReader.Feature.SupportArrayToBean + ); + return config; + } +} diff --git a/se-common/src/main/java/com/terra/common/entity/all/FastJson2JsonRedisSerializer.java b/se-common/src/main/java/com/terra/common/entity/all/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..69e0483 --- /dev/null +++ b/se-common/src/main/java/com/terra/common/entity/all/FastJson2JsonRedisSerializer.java @@ -0,0 +1,44 @@ +package com.terra.common.entity.all; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.filter.Filter; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> { + public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + + public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.terra" }; + + static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(JSON_WHITELIST_STR); + + private final 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, AUTO_TYPE_FILTER); + } +} diff --git a/se-common/src/main/java/com/terra/common/entity/lf/TokenPo.java b/se-common/src/main/java/com/terra/common/entity/lf/TokenPo.java index ba46536..9c5ac4e 100644 --- a/se-common/src/main/java/com/terra/common/entity/lf/TokenPo.java +++ b/se-common/src/main/java/com/terra/common/entity/lf/TokenPo.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.sql.Timestamp; /** @@ -17,7 +18,9 @@ @AllArgsConstructor @TableName("lf.sys_token") @EqualsAndHashCode(callSuper = false) -public class TokenPo { +public class TokenPo implements Serializable { + private static final long serialVersionUID = 4743559455078257191L; + private Integer id; private String uname; diff --git a/se-common/src/main/java/com/terra/common/entity/lf/UserPo.java b/se-common/src/main/java/com/terra/common/entity/lf/UserPo.java index b202963..a4f8a03 100644 --- a/se-common/src/main/java/com/terra/common/entity/lf/UserPo.java +++ b/se-common/src/main/java/com/terra/common/entity/lf/UserPo.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.sql.Timestamp; /** @@ -17,7 +18,9 @@ @AllArgsConstructor @TableName("lf.sys_user") @EqualsAndHashCode(callSuper = false) -public class UserPo { +public class UserPo implements Serializable { + private static final long serialVersionUID = 2246505129003195572L; + private Integer id; private Integer depid; diff --git a/se-common/src/main/java/com/terra/common/interceptor/AuthInterceptor.java b/se-common/src/main/java/com/terra/common/interceptor/AuthInterceptor.java index fd6b66d..f9c1700 100644 --- a/se-common/src/main/java/com/terra/common/interceptor/AuthInterceptor.java +++ b/se-common/src/main/java/com/terra/common/interceptor/AuthInterceptor.java @@ -7,12 +7,14 @@ import com.terra.common.entity.lf.UserPo; import com.terra.common.helper.StringHelper; import com.terra.common.helper.WebHelper; +import com.terra.common.service.CommonService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -23,6 +25,8 @@ */ @Configuration public class AuthInterceptor implements HandlerInterceptor { + private CommonService commonService; + private static final Log log = LogFactory.getLog(AuthInterceptor.class); private static final String NO_TOKEN = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.TOKEN_ERROR, "鎵句笉鍒颁护鐗�")); @@ -39,9 +43,9 @@ private static final String ILLEGAL_TOKEN = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.UNAUTHORIZED, "浠ょ墝鏉ユ簮闈炴硶")); - //public AuthInterceptor(SysService sysService) { - // this.sysService = sysService; - //} + public AuthInterceptor(CommonService commonService) { + this.commonService = commonService; + } /** * Controller鎵ц涔嬪墠鎵ц锛屽鏋滆繑鍥炲�兼槸true鍒欎唬琛ㄦ斁琛岋紝杩斿洖false鍒欐嫤鎴� @@ -62,8 +66,8 @@ } // 3.鑾峰彇鐢ㄦ埛浠ょ墝 - UserPo ue = new UserPo(); //sysService.tokenService.getUserByToken(token); - if (ue == null) { + UserPo ue = commonService.getUserByToken(token); //new UserPo(); //sysService.tokenService.getUserByToken(token); + if (null == ue) { return WebHelper.writeStr2Page(response, NO_LOGIN); } @@ -126,19 +130,21 @@ * 妫�鏌ユ潈闄� */ private boolean checkPerms(UserPo ue, HttpServletRequest request) { - List<String> list = null; //sysService.permsService.selectPerms(ue.getUid()); - if (list == null || list.size() == 0) { - return false; - } + return true; - String url = request.getRequestURI(); - for (String perm : list) { - if (url.contains(perm)) { - return true; - } - } - - return false; +// List<String> list = null; //sysService.permsService.selectPerms(ue.getUid()); +// if (list == null || list.size() == 0) { +// return false; +// } +// +// String url = request.getRequestURI(); +// for (String perm : list) { +// if (url.contains(perm)) { +// return true; +// } +// } +// +// return false; } /** diff --git a/se-common/src/main/java/com/terra/common/mapper/OperatePoMapper.java b/se-common/src/main/java/com/terra/common/mapper/CommonMapper.java similarity index 93% rename from se-common/src/main/java/com/terra/common/mapper/OperatePoMapper.java rename to se-common/src/main/java/com/terra/common/mapper/CommonMapper.java index f3c1b6c..2319b7e 100644 --- a/se-common/src/main/java/com/terra/common/mapper/OperatePoMapper.java +++ b/se-common/src/main/java/com/terra/common/mapper/CommonMapper.java @@ -13,7 +13,7 @@ @Mapper @Repository -public interface OperatePoMapper extends BaseMapper<OperatePo> { +public interface CommonMapper extends BaseMapper<OperatePo> { @Insert("INSERT INTO lf.sys_operate(url, ip, exec, clazz, type, userid, bak, modular1, modular2) VALUES (#{url}, #{ip}, #{exec}, #{clazz}, #{type}, #{userid}, #{bak}, #{modular1}, #{modular2})") int insertOperate(Map<String, Object> map); diff --git a/se-common/src/main/java/com/terra/common/service/TokenHelper.java b/se-common/src/main/java/com/terra/common/service/CommonService.java similarity index 89% rename from se-common/src/main/java/com/terra/common/service/TokenHelper.java rename to se-common/src/main/java/com/terra/common/service/CommonService.java index 24aa174..664444b 100644 --- a/se-common/src/main/java/com/terra/common/service/TokenHelper.java +++ b/se-common/src/main/java/com/terra/common/service/CommonService.java @@ -5,7 +5,7 @@ import com.terra.common.entity.lf.UserPo; import com.terra.common.helper.StringHelper; import com.terra.common.helper.WebHelper; -import com.terra.common.mapper.OperatePoMapper; +import com.terra.common.mapper.CommonMapper; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -17,17 +17,17 @@ * @author WWW */ @Component -public class TokenHelper { +public class CommonService { @Resource RedisService redisService; @Resource - OperatePoMapper mapper; + CommonMapper mapper; - public static Integer getCurrentUserId(HttpServletRequest req) { + public UserPo getCurrentUser(HttpServletRequest req) { String token = WebHelper.getToken(req); - return null; + return getUserByToken(token); } public UserPo getUserByToken(String token) { diff --git a/se-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/se-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index f81e019..5c70f54 100644 --- a/se-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/se-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,12 @@ +# 鏈嶅姟 +com.terra.common.service.RedisService +com.terra.common.service.CommonService +# 鍒囬潰 +com.terra.common.aspect.LogAspect +# 鎷︽埅鍣� +com.terra.common.interceptor.AuthInterceptor +# 閰嶇疆 com.terra.common.config.SpringDocAutoConfiguration com.terra.common.config.MybatisPlusConfig -com.terra.common.aspect.LogAspect \ No newline at end of file +com.terra.common.config.RedisConfig +com.terra.common.config.WebConfig \ No newline at end of file diff --git a/se-system/src/main/java/com/terra/system/config/WebConfig.java b/se-system/src/main/java/com/terra/system/config/WebConfig.java index e95e229..73de1c6 100644 --- a/se-system/src/main/java/com/terra/system/config/WebConfig.java +++ b/se-system/src/main/java/com/terra/system/config/WebConfig.java @@ -4,7 +4,8 @@ import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import com.alibaba.fastjson2.JSON; -import com.terra.system.interceptor.AuthInterceptor; +import com.terra.common.interceptor.AuthInterceptor; +import com.terra.common.service.CommonService; import com.terra.system.service.all.SysService; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -29,10 +30,10 @@ * Web閰嶇疆绫� * @author WWW */ -@Configuration +//@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Resource - private SysService sysService; + CommonService commonService; @Override public void addViewControllers(ViewControllerRegistry registry) { @@ -48,7 +49,7 @@ * @return */ public AuthInterceptor getAuthBean() { - return new AuthInterceptor(sysService); + return new AuthInterceptor(commonService); } /** -- Gitblit v1.9.3