1. 代码优化

2. 增加工具类方法
3. 结构调整
master
陈峰 1 year ago
parent 2b717426a7
commit 4150ad8787
  1. 2
      framework-core/pom.xml
  2. 23
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/MvcConfiguration.java
  3. 106
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/filter/RepeatHttpServletRequestWrapper.java
  4. 28
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/filter/RequestFilterWrapper.java
  5. 13
      framework-core/src/main/java/com/unionmed/framework/spring/mvc/request/DecryptRequestBodyAdvice.java
  6. 28
      framework-core/src/main/java/com/unionmed/framework/util/ObjectUtils.java
  7. 2
      framework-orm/pom.xml
  8. 2
      framework-test/pom.xml
  9. 2
      pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.14</version> <version>0.0.15</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -1,11 +1,16 @@
package com.unionmed.framework.spring.mvc.response; package com.unionmed.framework.spring.mvc;
import com.unionmed.framework.spring.mvc.filter.RequestFilterWrapper;
import com.unionmed.framework.spring.mvc.response.RequestResponseBodyCryptProperties;
import com.unionmed.framework.spring.mvc.response.ResponseBodyProcessor;
import com.unionmed.framework.spring.mvc.response.ResponseBodyProcessorChain;
import com.unionmed.framework.spring.mvc.response.datatemplate.DataTemplateResponseBodyInterceptor; import com.unionmed.framework.spring.mvc.response.datatemplate.DataTemplateResponseBodyInterceptor;
import com.unionmed.framework.spring.mvc.response.interceptor.EncryptionResponseBodyInterceptor; import com.unionmed.framework.spring.mvc.response.interceptor.EncryptionResponseBodyInterceptor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor; import org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
@ -20,7 +25,7 @@ import java.util.List;
*/ */
@EnableConfigurationProperties({RequestResponseBodyCryptProperties.class}) @EnableConfigurationProperties({RequestResponseBodyCryptProperties.class})
@Configuration @Configuration
public class ResponseBodyConfiguration { public class MvcConfiguration {
@Autowired @Autowired
private RequestResponseBodyCryptProperties requestResponseBodyCryptProperties; private RequestResponseBodyCryptProperties requestResponseBodyCryptProperties;
@ -31,7 +36,7 @@ public class ResponseBodyConfiguration {
ResponseBodyProcessorChain chain = new ResponseBodyProcessorChain(); ResponseBodyProcessorChain chain = new ResponseBodyProcessorChain();
chain.add(new DataTemplateResponseBodyInterceptor(), new EncryptionResponseBodyInterceptor(requestResponseBodyCryptProperties)); chain.add(new DataTemplateResponseBodyInterceptor(), new EncryptionResponseBodyInterceptor(requestResponseBodyCryptProperties));
return new ResponseBodyProcessor(requestMappingHandlerAdapter.getMessageConverters(), chain);//初始化过滤器 return new ResponseBodyProcessor(requestMappingHandlerAdapter.getMessageConverters(), chain);
} }
@PostConstruct @PostConstruct
@ -51,4 +56,14 @@ public class ResponseBodyConfiguration {
} }
return -1; return -1;
} }
@Bean
public FilterRegistrationBean repeatRequestFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new RequestFilterWrapper(requestResponseBodyCryptProperties));
registration.addUrlPatterns("/*");
registration.setName("repeatRequestFilter");
registration.setOrder(1);
return registration;
}
} }

@ -0,0 +1,106 @@
package com.unionmed.framework.spring.mvc.filter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.unionmed.framework.http.HttpHeaders;
import com.unionmed.framework.spring.mvc.response.BodyCryptUtils;
import com.unionmed.framework.spring.mvc.response.RequestResponseBodyCryptProperties;
import com.unionmed.framework.util.ObjectUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* @author ianChen
* @date 2023/6/27 16:49
*/
@Slf4j
public class RepeatHttpServletRequestWrapper extends HttpServletRequestWrapper {
private ServletInputStream is;
public RepeatHttpServletRequestWrapper(RequestResponseBodyCryptProperties requestResponseBodyCryptProperties, HttpServletRequest request) throws IOException {
super(request);
try {
String body;
if (ObjectUtils.startWithIgnore(request.getHeader(HttpHeaders.CONTENT_TYPE), HttpHeaders.FORM_DATA)) {
is = request.getInputStream();
body = "StreamBody";
} else {
body = IOUtils.toString(request.getInputStream(), Charset.defaultCharset());
if (ObjectUtils.notEmpty(body) && requestResponseBodyCryptProperties.isEnabled() && ObjectUtils.equalsIgnore(request.getHeader(HttpHeaders.X_DATA_CRYPT_E), HttpHeaders.X_DATA_CRYPT_E_VALUE_TRUE)) {
if (log.isDebugEnabled())
log.debug("InputMessage Body: {}", body);
body = BodyCryptUtils.decrypt(requestResponseBodyCryptProperties.getSk(), body);
}
is = new RepeatServletInputStreamWrapper(new ByteArrayInputStream(body.getBytes(Charset.defaultCharset())));
}
if (log.isDebugEnabled()) {
log.debug("URI: {}, Method: {}", request.getRequestURI(), request.getMethod());
Map<String, Object> headers = new HashMap<>();
String headerKey;
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
headers.put(headerKey = headerNames.nextElement(), request.getHeader(headerKey));
}
log.debug("Headers: {}", new JSONObject(headers).toJSONString());
log.debug("RequestParameter: {}", request.getParameterMap() == null ? "" : JSON.toJSONString(request.getParameterMap()));
log.debug("RequestBody: {}", body);
}
} catch (IOException ex) {
log.error("获取Request Body数据异常", ex);
is = request.getInputStream();
}
}
@Override
public ServletInputStream getInputStream() throws IOException {
return is;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
class RepeatServletInputStreamWrapper extends ServletInputStream {
private final InputStream is;
public RepeatServletInputStreamWrapper(InputStream is) {
this.is = is;
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return this.is.read();
}
public synchronized void reset() throws IOException {
this.is.reset();
}
}
}

@ -0,0 +1,28 @@
package com.unionmed.framework.spring.mvc.filter;
import com.unionmed.framework.spring.mvc.response.RequestResponseBodyCryptProperties;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author ianChen
* @date 2023/6/27 16:47
*/
public class RequestFilterWrapper extends OncePerRequestFilter {
private RequestResponseBodyCryptProperties requestResponseBodyCryptProperties;
public RequestFilterWrapper(RequestResponseBodyCryptProperties requestResponseBodyCryptProperties) {
this.requestResponseBodyCryptProperties = requestResponseBodyCryptProperties;
}
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new RepeatHttpServletRequestWrapper(requestResponseBodyCryptProperties, httpServletRequest), httpServletResponse);
}
}

@ -1,7 +1,9 @@
package com.unionmed.framework.spring.mvc.response; package com.unionmed.framework.spring.mvc.request;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.unionmed.framework.http.HttpHeaders; import com.unionmed.framework.http.HttpHeaders;
import com.unionmed.framework.spring.mvc.response.BodyCryptUtils;
import com.unionmed.framework.spring.mvc.response.RequestResponseBodyCryptProperties;
import com.unionmed.framework.util.ObjectUtils; import com.unionmed.framework.util.ObjectUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@ -17,13 +19,14 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.charset.Charset;
/** /**
* @author ianChen * @author ianChen
* @date 2023/6/26 14:02 * @date 2023/6/26 14:02
*/ */
@Slf4j @Slf4j
@ControllerAdvice //@ControllerAdvice
public class DecryptRequestBodyAdvice implements RequestBodyAdvice { public class DecryptRequestBodyAdvice implements RequestBodyAdvice {
@Autowired @Autowired
@ -36,8 +39,10 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice {
@Override @Override
public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException { public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
String body = IOUtils.toString(inputMessage.getBody(), HttpHeaders.CHARSET_UTF8); String body = IOUtils.toString(inputMessage.getBody(), Charset.defaultCharset());
if (ObjectUtils.notEmpty(body) && requestResponseBodyCryptProperties.isEnabled() && ObjectUtils.equalsIgnore(inputMessage.getHeaders().getFirst(HttpHeaders.X_DATA_CRYPT_E), HttpHeaders.X_DATA_CRYPT_E_VALUE_TRUE)) { if (ObjectUtils.notEmpty(body) && requestResponseBodyCryptProperties.isEnabled() && ObjectUtils.equalsIgnore(inputMessage.getHeaders().getFirst(HttpHeaders.X_DATA_CRYPT_E), HttpHeaders.X_DATA_CRYPT_E_VALUE_TRUE)) {
if (log.isDebugEnabled())
log.debug("InputMessage Body: {}", body);
body = BodyCryptUtils.decrypt(requestResponseBodyCryptProperties.getSk(), body); body = BodyCryptUtils.decrypt(requestResponseBodyCryptProperties.getSk(), body);
} }
@ -49,7 +54,7 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice {
log.debug("RequestBody: {}", body); log.debug("RequestBody: {}", body);
} }
InputStream is = IOUtils.toInputStream(body, HttpHeaders.CHARSET_UTF8); InputStream is = IOUtils.toInputStream(body, Charset.defaultCharset());
return new HttpInputMessage() { return new HttpInputMessage() {
@Override @Override
public InputStream getBody() throws IOException { public InputStream getBody() throws IOException {

@ -157,6 +157,30 @@ public class ObjectUtils {
return !equals(o, o2); return !equals(o, o2);
} }
public static boolean startWith(String source, String target) {
return notEmptyAnd(source, target) && source.trim().startsWith(target.trim());
}
public static boolean startWith(String source, String target, int offset) {
return notEmptyAnd(source, target) && source.trim().startsWith(target.trim(), offset);
}
public static boolean startWithIgnore(String source, String target) {
return notEmptyAnd(source, target) && source.trim().toLowerCase().startsWith(target.trim().toLowerCase());
}
public static boolean startWithIgnore(String source, String target, int offset) {
return notEmptyAnd(source, target) && source.trim().toLowerCase().startsWith(target.trim().toLowerCase(), offset);
}
public static boolean endWith(String source, String target) {
return notEmptyAnd(source, target) && source.trim().endsWith(target.trim());
}
public static boolean endWithIgnore(String source, String target) {
return notEmptyAnd(source, target) && source.trim().toLowerCase().endsWith(target.trim().toLowerCase());
}
public static boolean arrayNotEquals(Object o1, Object o2) { public static boolean arrayNotEquals(Object o1, Object o2) {
return !arrayEquals(o1, o2); return !arrayEquals(o1, o2);
} }
@ -169,9 +193,9 @@ public class ObjectUtils {
if (isEmpty(s)) if (isEmpty(s))
return false; return false;
String _s = s.trim(); String _s = s.trim();
if (_s.startsWith("{") && _s.endsWith("}")) if (_s.charAt(0) == '{' && _s.charAt(_s.length() - 1) == '}')
return true; return true;
if (_s.startsWith("[") && _s.endsWith("]")) if (_s.charAt(0) == '[' && _s.charAt(_s.length() - 1) == ']')
return true; return true;
return false; return false;
} }

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<version>0.0.14</version> <version>0.0.15</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.14</version> <version>0.0.15</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -9,7 +9,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.unionmed</groupId> <groupId>com.unionmed</groupId>
<artifactId>unionmed-framework</artifactId> <artifactId>unionmed-framework</artifactId>
<version>0.0.14</version> <version>0.0.15</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>unionmed-framework</name> <name>unionmed-framework</name>

Loading…
Cancel
Save