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}
+
+
+