diff --git a/framework-core/pom.xml b/framework-core/pom.xml index b44a1a8..6d7e438 100644 --- a/framework-core/pom.xml +++ b/framework-core/pom.xml @@ -5,7 +5,7 @@ com.unionmed unionmed-framework - 0.0.9 + 0.0.11 4.0.0 @@ -46,11 +46,6 @@ runtime true - @@ -137,12 +132,6 @@ mksapi-jar - - - - - - org.apache.httpcomponents @@ -166,6 +155,12 @@ org.apache.httpcomponents httpmime + + + + org.bouncycastle + bcprov-jdk18on + diff --git a/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java b/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java new file mode 100644 index 0000000..eae80bd --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/crypto/AES.java @@ -0,0 +1,50 @@ +package com.unionmed.framework.crypto; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; + +/** + * @author ianChen + * @date 2023/6/21 11:45 + */ +@Slf4j +public class AES { + + private static final String ALGORITHM = "AES"; + private static final String PADDING = "AES/CBC/ISO10126Padding"; // AES/CBC/PKCS5PADDING + + private static byte[] toUtf8Bytes(String s) throws UnsupportedEncodingException { + return s.getBytes("UTF-8"); + } + + public static String encrypt(String sk, String iv, String value) { + try { + IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); + SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); + Cipher cipher = Cipher.getInstance(PADDING); + cipher.init(Cipher.ENCRYPT_MODE, skSpec, ivSpec); + return Base64.encodeBase64String(cipher.doFinal(value.getBytes())); + } catch (Exception ex) { + log.error("AES加密失败", ex); + return null; + } + } + + public static String decrypt(String sk, String iv, String val) { + try { + IvParameterSpec ivSpec = new IvParameterSpec(toUtf8Bytes(iv)); + SecretKeySpec skSpec = new SecretKeySpec(toUtf8Bytes(sk), ALGORITHM); + Cipher cipher = Cipher.getInstance(PADDING); + cipher.init(Cipher.DECRYPT_MODE, skSpec, ivSpec); + return new String(cipher.doFinal(Base64.decodeBase64(val))); + } catch (Exception ex) { + log.error("AES解密失败", ex); + return null; + } + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/http/HttpHeaders.java b/framework-core/src/main/java/com/unionmed/framework/http/HttpHeaders.java index 60d1cc4..e90755a 100644 --- a/framework-core/src/main/java/com/unionmed/framework/http/HttpHeaders.java +++ b/framework-core/src/main/java/com/unionmed/framework/http/HttpHeaders.java @@ -12,7 +12,11 @@ import java.util.Map; */ public class HttpHeaders { + // 数据模板 public static final String X_DATA_TEMPLATE = "X-Data-Template"; + // response data 数据是否加密 + public static final String X_DATA_CRYPT_E = "X-DATA-CRYPT-E"; + public static final String X_DATA_CRYPT_E_VALUE_TRUE = "true"; public static final String CHARSET_UTF8 = "UTF-8"; public static final String APPLICATION_JSON_UTF8 = "application/json;charset=utf-8"; diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseBodyProcessor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseBodyProcessor.java deleted file mode 100644 index de55c41..0000000 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseBodyProcessor.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.unionmed.framework.spring.mvc; - -import com.unionmed.framework.http.HttpHeaders; -import com.unionmed.framework.spring.mvc.annotation.ResponsePrototype; -import com.unionmed.framework.spring.mvc.datatemplate.DataTemplate; -import com.unionmed.framework.spring.mvc.datatemplate.DataTemplates; -import com.unionmed.framework.util.ObjectUtils; -import com.unionmed.framework.spring.mvc.BaseReturn; -import org.springframework.core.MethodParameter; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.HttpMessageNotWritableException; -import org.springframework.web.HttpMediaTypeNotAcceptableException; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.ModelAndViewContainer; -import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; - -import java.io.IOException; -import java.util.List; - -/** - * @author ianChen - * @date 2022/12/16 10:49 - */ -public class ResponseBodyProcessor extends RequestResponseBodyMethodProcessor { - - public ResponseBodyProcessor(List> converters) { - super(converters); - } - - private Object handleValue(Object returnValue, NativeWebRequest webRequest) { - String dataTemplateName = webRequest.getHeader(HttpHeaders.X_DATA_TEMPLATE); - if (ObjectUtils.isEmpty(dataTemplateName)) - return returnValue; - - DataTemplate dataTemplate = DataTemplates.get(dataTemplateName); - if (null == dataTemplate) - return returnValue; - - return dataTemplate.handle(returnValue); - } - - @Override - public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException { - if (!hasResponsePrototype(returnType)) { - if (returnValue == null) { - returnValue = BaseReturn.suc(); - } else if (!(returnValue instanceof BaseReturn)) { - returnValue = BaseReturn.suc(returnValue); - } - - returnValue = handleValue(returnValue, webRequest); - } - super.handleReturnValue(returnValue, returnType, mavContainer, webRequest); - } - - private boolean hasResponsePrototype(MethodParameter returnType) { - return returnType.getAnnotatedElement().getAnnotation(ResponsePrototype.class) != null; - } - - @Override - public boolean supportsReturnType(MethodParameter returnType) { - return returnType.getDeclaringClass().getName().startsWith("com.unionmed"); - } -} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseTemplate.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseTemplate.java deleted file mode 100644 index 4c7353b..0000000 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/ResponseTemplate.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.unionmed.framework.spring.mvc; - -/** - * @author ianChen - * @date 2022/12/16 16:23 - */ -public interface ResponseTemplate { -} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/MvcConfig.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyConfiguration.java similarity index 70% rename from framework-core/src/main/java/com/unionmed/framework/spring/mvc/MvcConfig.java rename to framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyConfiguration.java index 6fdaf4e..a0d6c40 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/MvcConfig.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyConfiguration.java @@ -1,10 +1,12 @@ -package com.unionmed.framework.spring.mvc; +package com.unionmed.framework.spring.mvc.response; +import com.unionmed.framework.spring.mvc.response.datatemplate.DataTemplateResponseBodyInterceptor; +import com.unionmed.framework.spring.mvc.response.interceptor.EncryptionResponseBodyInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; @@ -14,23 +16,29 @@ import java.util.List; /** * @author ianChen - * @date 2022/12/16 10:47 + * @date 2023/6/25 15:25 */ @Configuration -public class MvcConfig implements WebMvcConfigurer { +public class ResponseBodyConfiguration { @Autowired + private Environment environment; + @Autowired private RequestMappingHandlerAdapter requestMappingHandlerAdapter; - @Bean +// @Bean public ResponseBodyProcessor responseBodyProcessor() { - return new ResponseBodyProcessor(requestMappingHandlerAdapter.getMessageConverters());//初始化过滤器 + ResponseBodyProcessorChain chain = new ResponseBodyProcessorChain(); + chain.add(new DataTemplateResponseBodyInterceptor(), new EncryptionResponseBodyInterceptor(environment)); + + return new ResponseBodyProcessor(requestMappingHandlerAdapter.getMessageConverters(), chain);//初始化过滤器 } @PostConstruct public void regCustomReturnValueProcessor() { final List handlers = new ArrayList<>(requestMappingHandlerAdapter.getReturnValueHandlers()); handlers.add(obtainValueHandlerPosition(handlers, HttpEntityMethodProcessor.class) - 1, responseBodyProcessor()); + requestMappingHandlerAdapter.setReturnValueHandlers(handlers); } diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessor.java new file mode 100644 index 0000000..99b59e0 --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessor.java @@ -0,0 +1,37 @@ +package com.unionmed.framework.spring.mvc.response; + +import org.springframework.core.MethodParameter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.web.HttpMediaTypeNotAcceptableException; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; +import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; + +import java.io.IOException; +import java.util.List; + +/** + * @author ianChen + * @date 2022/12/16 10:49 + */ +public class ResponseBodyProcessor extends RequestResponseBodyMethodProcessor { + + private final ResponseBodyProcessorChain responseBodyProcessorChain; + + public ResponseBodyProcessor(List> converters, ResponseBodyProcessorChain responseBodyProcessorChain) { + super(converters); + this.responseBodyProcessorChain = responseBodyProcessorChain; + } + + @Override + public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException { + returnValue = responseBodyProcessorChain.handler(returnValue, returnType, mavContainer, webRequest); + super.handleReturnValue(returnValue, returnType, mavContainer, webRequest); + } + + @Override + public boolean supportsReturnType(MethodParameter returnType) { + return returnType.getDeclaringClass().getName().startsWith("com.unionmed"); + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessorChain.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessorChain.java new file mode 100644 index 0000000..f766cfd --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/ResponseBodyProcessorChain.java @@ -0,0 +1,43 @@ +package com.unionmed.framework.spring.mvc.response; + +import com.unionmed.framework.spring.mvc.response.interceptor.ResponseBodyInterceptor; +import com.unionmed.framework.util.ObjectUtils; +import org.springframework.core.MethodParameter; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author ianChen + * @date 2023/6/25 15:10 + */ +public class ResponseBodyProcessorChain { + + private List interceptors = new ArrayList<>(0); + + public Object handler(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { + if (ObjectUtils.notEmpty(interceptors)) { + for (ResponseBodyInterceptor interceptor : interceptors) { + returnValue = interceptor.handleReturnValue(returnValue, returnType, mavContainer, webRequest); + } + } + return returnValue; + } + + public boolean add(ResponseBodyInterceptor... interceptors) { + if (ObjectUtils.isEmpty(interceptors)) return false; + + for (ResponseBodyInterceptor interceptor : interceptors) { + if (interceptor != null) { + this.interceptors.add(interceptor); + } + } + + Collections.sort(this.interceptors, Comparator.comparingInt(ResponseBodyInterceptor::getOrder)); + return true; + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplate.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplate.java similarity index 82% rename from framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplate.java rename to framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplate.java index 2487c01..2deb1da 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplate.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplate.java @@ -1,4 +1,4 @@ -package com.unionmed.framework.spring.mvc.datatemplate; +package com.unionmed.framework.spring.mvc.response.datatemplate; /** * @author ianChen diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplateResponseBodyInterceptor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplateResponseBodyInterceptor.java new file mode 100644 index 0000000..e289731 --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplateResponseBodyInterceptor.java @@ -0,0 +1,42 @@ +package com.unionmed.framework.spring.mvc.response.datatemplate; + +import com.unionmed.framework.http.HttpHeaders; +import com.unionmed.framework.spring.mvc.BaseReturn; +import com.unionmed.framework.spring.mvc.annotation.ResponsePrototype; +import com.unionmed.framework.spring.mvc.response.interceptor.ResponseBodyInterceptor; +import com.unionmed.framework.util.ObjectUtils; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.Order; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; + +/** + * @author ianChen + * @date 2023/6/25 10:29 + */ +public class DataTemplateResponseBodyInterceptor implements ResponseBodyInterceptor { + + @Override + public Object handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { + if (returnType.getAnnotatedElement().getAnnotation(ResponsePrototype.class) != null) + return returnValue; + + if (returnValue == null) { + returnValue = BaseReturn.suc(); + } else if (!BaseReturn.class.isAssignableFrom(returnValue.getClass())) { + returnValue = BaseReturn.suc(returnValue); + } + + String dataTemplate = webRequest.getHeader(HttpHeaders.X_DATA_TEMPLATE); + if (ObjectUtils.isEmpty(dataTemplate)) + return returnValue; + + DataTemplate template = DataTemplates.get(dataTemplate); + return null == template ? returnValue : template.handle(returnValue); + } + + @Override + public int getOrder() { + return 9; + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplates.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplates.java similarity index 96% rename from framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplates.java rename to framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplates.java index f984069..e7a74fe 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DataTemplates.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DataTemplates.java @@ -1,4 +1,4 @@ -package com.unionmed.framework.spring.mvc.datatemplate; +package com.unionmed.framework.spring.mvc.response.datatemplate; import com.unionmed.framework.bean.BeanFactory; import com.unionmed.framework.util.ObjectUtils; diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DoubleNestDataTemplate.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DoubleNestDataTemplate.java similarity index 91% rename from framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DoubleNestDataTemplate.java rename to framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DoubleNestDataTemplate.java index bbf6c89..30e2911 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/DoubleNestDataTemplate.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/DoubleNestDataTemplate.java @@ -1,4 +1,4 @@ -package com.unionmed.framework.spring.mvc.datatemplate; +package com.unionmed.framework.spring.mvc.response.datatemplate; import com.unionmed.framework.spring.mvc.BaseReturn; import org.springframework.stereotype.Component; diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/SingleNestDataTemplate.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/SingleNestDataTemplate.java similarity index 91% rename from framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/SingleNestDataTemplate.java rename to framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/SingleNestDataTemplate.java index 15bbcd7..d41dae3 100644 --- a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/datatemplate/SingleNestDataTemplate.java +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/datatemplate/SingleNestDataTemplate.java @@ -1,4 +1,4 @@ -package com.unionmed.framework.spring.mvc.datatemplate; +package com.unionmed.framework.spring.mvc.response.datatemplate; import com.alibaba.fastjson.JSONObject; import com.unionmed.framework.spring.mvc.BaseReturn; @@ -23,7 +23,7 @@ public class SingleNestDataTemplate implements DataTemplate { if (returnValue instanceof BaseReturn) { Object data = ((BaseReturn) returnValue).getData(); if (data instanceof BaseReturn) { - returnValue = ((BaseReturn) returnValue).getData(); + return data; } else if (data instanceof JSONObject && BaseReturnUtils.isBaseReturnFormat((JSONObject) data)) { return data; } else { diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java new file mode 100644 index 0000000..1f19d54 --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/EncryptionResponseBodyInterceptor.java @@ -0,0 +1,88 @@ +package com.unionmed.framework.spring.mvc.response.interceptor; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.unionmed.framework.crypto.AES; +import com.unionmed.framework.http.HttpHeaders; +import com.unionmed.framework.spring.mvc.BaseReturn; +import com.unionmed.framework.spring.mvc.BaseReturnUtils; +import com.unionmed.framework.util.Generators; +import com.unionmed.framework.util.ObjectUtils; +import org.springframework.core.MethodParameter; +import org.springframework.core.env.Environment; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; + +import java.util.Map; + +/** + * 加密拦截 + * + * @author ianChen + * @date 2023/6/25 10:33 + */ +public class EncryptionResponseBodyInterceptor implements ResponseBodyInterceptor { + + private final Environment environment; + private final String RESOURCE_PREFIX = "unionmed.web.response.body.crypt.aes"; + private final String SK_KEY = RESOURCE_PREFIX + ".sk"; + private final String ENABLED_KEY = RESOURCE_PREFIX + ".enabled"; + private final boolean enabled; + private final String sk; + + public EncryptionResponseBodyInterceptor(Environment environment) { + this.environment = environment; + if (ObjectUtils.equalsIgnore(environment.getProperty(ENABLED_KEY), "true")) { + this.sk = environment.getProperty(SK_KEY); + if (ObjectUtils.isEmpty(sk)) + throw new NullPointerException("AES SecretKey is empty"); + this.enabled = true; + } else { + this.enabled = false; + this.sk = null; + } + } + + @Override + public Object handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { + if (!this.enabled || returnValue == null) return null; + + String value = webRequest.getHeader(HttpHeaders.X_DATA_CRYPT_E); + if (ObjectUtils.equalsIgnore(value, HttpHeaders.X_DATA_CRYPT_E_VALUE_TRUE)) { + returnValue = handleReturnValue(sk, Generators.randomMix(16), returnValue); + } + + return returnValue; + } + + private Object handleReturnValue(String sk, String iv, Object returnValue) { + if (returnValue instanceof BaseReturn) { + BaseReturn br = (BaseReturn) returnValue; + if (br.getData() != null) { + br.setData(handleReturnValue(sk, iv, br.getData())); + return returnValue; + } + } else if (returnValue instanceof String) { + String str = (String) returnValue; + if (JSONUtil.isJsonObj(str)) { + return handleReturnValue(sk, iv, JSONObject.parseObject(str)); + } + } else if (returnValue instanceof JSONObject) { + JSONObject jObject = (JSONObject) returnValue; + if (BaseReturnUtils.isBaseReturnFormat(jObject)) { + jObject.put("data", handleReturnValue(sk, iv, jObject.get("data"))); + return jObject; + } + } else if (returnValue instanceof Map) { + return handleReturnValue(sk, iv, new JSONObject((Map) returnValue)); + } + + return iv + AES.encrypt(sk, iv, JSON.toJSONString(returnValue)); + } + + @Override + public int getOrder() { + return 8; + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/ResponseBodyInterceptor.java b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/ResponseBodyInterceptor.java new file mode 100644 index 0000000..98fe428 --- /dev/null +++ b/framework-core/src/main/java/com/unionmed/framework/spring/mvc/response/interceptor/ResponseBodyInterceptor.java @@ -0,0 +1,27 @@ +package com.unionmed.framework.spring.mvc.response.interceptor; + +import org.springframework.core.MethodParameter; +import org.springframework.core.Ordered; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; + +/** + * @author ianChen + * @date 2023/6/25 10:27 + */ +public interface ResponseBodyInterceptor extends Ordered { + + /** + * @param returnValue + * @param returnType + * @param mavContainer + * @param webRequest + * @return + */ + Object handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest); + + @Override + default int getOrder() { + return 10; + } +} diff --git a/framework-core/src/main/java/com/unionmed/framework/util/Generators.java b/framework-core/src/main/java/com/unionmed/framework/util/Generators.java index 1b316a3..c58b031 100644 --- a/framework-core/src/main/java/com/unionmed/framework/util/Generators.java +++ b/framework-core/src/main/java/com/unionmed/framework/util/Generators.java @@ -32,6 +32,29 @@ public final class Generators { return sb.toString(); } + public static String randomMix(int length) { + StringBuilder sb = new StringBuilder(); + char a = 'a' - 10; + Random mix = new Random(); + while (sb.length() < length) { + int n = Math.abs(new Random().nextInt()) % 36; + if (n < 10) + n += '0'; + else + n += a; + + if (n >= 97 && n <= 122) { + if (mix.nextInt(2) == 0) { + n -= 32; + } + } + + sb.append((char) n); + } + + return sb.toString(); + } + /** * 生成一个仅由数字字符组成的随机字符串。 * diff --git a/framework-orm/pom.xml b/framework-orm/pom.xml index ef00e26..cd22068 100644 --- a/framework-orm/pom.xml +++ b/framework-orm/pom.xml @@ -5,7 +5,7 @@ unionmed-framework com.unionmed - 0.0.9 + 0.0.11 4.0.0 diff --git a/framework-test/pom.xml b/framework-test/pom.xml index 5b1cd51..5184739 100644 --- a/framework-test/pom.xml +++ b/framework-test/pom.xml @@ -5,7 +5,7 @@ com.unionmed unionmed-framework - 0.0.9 + 0.0.11 4.0.0 diff --git a/pom.xml b/pom.xml index f66be81..3734f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,278 +1,263 @@ - - org.springframework.boot - spring-boot-starter-parent - 2.3.4.RELEASE - + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + - 4.0.0 - com.unionmed - unionmed-framework - 0.0.9 - pom - unionmed-framework + 4.0.0 + com.unionmed + unionmed-framework + 0.0.11 + pom + unionmed-framework - - framework-core - framework-test - framework-orm - + + framework-core + framework-test + framework-orm + - - - - unionmed - Releases - http://47.118.41.58:8081/repository/unionmed-releases/ - - - unionmed - Snapshots - http://47.118.41.58:8081/repository/unionmed-snapshots/ - - + + + + unionmed + Releases + http://47.118.41.58:8081/repository/unionmed-releases/ + + + unionmed + Snapshots + http://47.118.41.58:8081/repository/unionmed-snapshots/ + + - - UTF-8 - UTF-8 - 1.8 + + UTF-8 + UTF-8 + 1.8 - 4.5.14 - 4.1.5 - 0.9.5.5 - 4.5.15 - 1.2.83 - 1.1.11 - 1.1.21 - 10.2.0.1.0 - 3.0.10 - 1.3.2 - 1.2.3 - 3.5.1 - 1.4.4 - 10.10.1 - 2.10.5 - 2.0.8 - 0.2 - 20.0 - 2.9.0 - 1.0.0 - 1.2.12 - 0.4.9 - 4.10.9049 - + 4.5.14 + 4.1.5 + 0.9.5.5 + 4.5.15 + 1.2.83 + 1.1.11 + 1.1.21 + 10.2.0.1.0 + 3.0.10 + 1.3.2 + 1.2.3 + 3.5.1 + 1.4.4 + 10.10.1 + 2.10.5 + 2.0.8 + 0.2 + 20.0 + 2.9.0 + 1.0.0 + 1.2.12 + 0.4.9 + 4.10.9049 + 1.73 + - - - - com.unionmed - framework-core - ${project.version} - - - com.unionmed - framework-test - ${project.version} - + + + + com.unionmed + framework-core + ${project.version} + + + com.unionmed + framework-test + ${project.version} + - - com.mchange - c3p0 - ${c3p0.version} - + + com.mchange + c3p0 + ${c3p0.version} + - - cn.hutool - hutool-all - ${hutool.version} - + + cn.hutool + hutool-all + ${hutool.version} + - - - com.alibaba - fastjson - ${fastjson.version} - - - com.alibaba - druid - ${druid.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.starter.version} - + + + com.alibaba + fastjson + ${fastjson.version} + + + com.alibaba + druid + ${druid.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.starter.version} + - - com.oracle - ojdbc14 - ${ojdbc14.version} - + + com.oracle + ojdbc14 + ${ojdbc14.version} + - - - - - + + + io.minio + minio + ${minio.version} + - - - io.minio - minio - ${minio.version} - + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.starter.version} + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.starter.version} + + + com.baomidou + mybatis-plus-annotation + ${mybatis.annotation.version} + - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis.starter.version} - - - - com.github.pagehelper - pagehelper-spring-boot-starter - ${pagehelper.starter.version} - - - com.baomidou - mybatis-plus-annotation - ${mybatis.annotation.version} - + + io.github.yedaxia + japidocs + ${japidocs.version} + + + io.github.openfeign + feign-core + ${feign-core.version} + - - io.github.yedaxia - japidocs - ${japidocs.version} - - - io.github.openfeign - feign-core - ${feign-core.version} - + + + io.springfox + springfox-swagger2 + ${springfox.swagger2.version} + + + io.springfox + springfox-spring-webmvc + ${springfox.swagger2.version} + + + io.springfox + springfox-swagger-ui + ${springfox.swagger2.version} + + + com.github.xiaoymin + knife4j-spring-boot-starter + + ${swagger.knife4j.version} + - - - io.springfox - springfox-swagger2 - ${springfox.swagger2.version} - - - io.springfox - springfox-spring-webmvc - ${springfox.swagger2.version} - - - io.springfox - springfox-swagger-ui - ${springfox.swagger2.version} - - - com.github.xiaoymin - knife4j-spring-boot-starter - - ${swagger.knife4j.version} - + + com.github.isrsal + spring-mvc-logger + ${spring-mvc-logger.version} + + + log4j + log4j + + + javax.servlet + servlet-api + + + org.slf4j + slf4j-log4j12 + + + - - - - - + + + com.google.guava + guava + ${guava.version} + + + com.google.code.gson + gson + ${gson.version} + - - com.github.isrsal - spring-mvc-logger - ${spring-mvc-logger.version} - - - log4j - log4j - - - javax.servlet - servlet-api - - - org.slf4j - slf4j-log4j12 - - - + + com + com.util + ${com.util.version} + + + log4j + log4j + ${log4j.version} + + + io.reactivex + rxnetty + ${rxnetty.version} + + + com.mks.api + mksapi-jar + ${mksapi.version} + - - - com.google.guava - guava - ${guava.version} - - - com.google.code.gson - gson - ${gson.version} - + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + org.apache.httpcomponents + httpcore + + + + + org.apache.httpcomponents + httpasyncclient + ${httpasyncclient.version} + + + org.apache.httpcomponents + httpmime + ${httpclient.version} + - - com - com.util - ${com.util.version} - - - - log4j - log4j - ${log4j.version} - - - io.reactivex - rxnetty - ${rxnetty.version} - - - com.mks.api - mksapi-jar - ${mksapi.version} - - - - - - - - - - - org.apache.httpcomponents - httpcore - ${httpcore.version} - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - org.apache.httpcomponents - httpcore - - - - - org.apache.httpcomponents - httpasyncclient - ${httpasyncclient.version} - - - org.apache.httpcomponents - httpmime - ${httpclient.version} - - - + + + org.bouncycastle + bcprov-jdk18on + ${bcprov.version} + + +