Explorar el Código

[幂等添加requestBody][新增]:添加requestBody二次读取,加入幂等检查

release_toaliyun_real
Stormeye Wu hace 7 años
padre
commit
81fbce9461
Se han modificado 12 ficheros con 382 adiciones y 21 borrados
  1. +11
    -0
      mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java
  2. +77
    -0
      mallinkAdmin/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java
  3. +33
    -0
      mallinkAdmin/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java
  4. +9
    -11
      mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  5. +12
    -0
      mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java
  6. +77
    -0
      mallinkBApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java
  7. +33
    -0
      mallinkBApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java
  8. +4
    -5
      mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  9. +12
    -0
      mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java
  10. +77
    -0
      mallinkCApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java
  11. +33
    -0
      mallinkCApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java
  12. +4
    -5
      mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java

+ 11
- 0
mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java Ver fichero

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.iformall.interceptor.HttpServletRequestWrapperFilter;
import com.iformall.interceptor.RequestInterceptor; import com.iformall.interceptor.RequestInterceptor;
import com.iformall.ueditor.ActionEnter; import com.iformall.ueditor.ActionEnter;
import com.iformall.ueditor.ConfigManager; import com.iformall.ueditor.ConfigManager;
@@ -13,6 +14,7 @@ import com.iformall.ueditor.UEditorConfig;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
@@ -133,4 +135,13 @@ public class WebConfig implements WebMvcConfigurer {
jackson2HttpMessageConverter.setObjectMapper(objectMapper); jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter); converters.add(jackson2HttpMessageConverter);
} }

@Bean
public FilterRegistrationBean<HttpServletRequestWrapperFilter> Filters() {
FilterRegistrationBean<HttpServletRequestWrapperFilter> registrationBean = new FilterRegistrationBean<HttpServletRequestWrapperFilter>();
registrationBean.setFilter(new HttpServletRequestWrapperFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("koalaSignFilter");
return registrationBean;
}
} }

+ 77
- 0
mallinkAdmin/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java Ver fichero

@@ -0,0 +1,77 @@
package com.iformall.interceptor;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String body;

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuffer stringBuilder = new StringBuffer();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
char[] charBuffer = new char[1024];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(body.getBytes("utf-8"));
return new ServletInputStream() {
@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 byteArrayInputStream.read();
}
};
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}

public String getBody() {
return this.body;
}
}

+ 33
- 0
mallinkAdmin/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java Ver fichero

@@ -0,0 +1,33 @@
package com.iformall.interceptor;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HttpServletRequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
}
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}

}

@Override
public void destroy() {

}
}

+ 9
- 11
mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java Ver fichero

@@ -14,6 +14,9 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;


@@ -37,20 +40,16 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
// 获取不检查幂等 // 获取不检查幂等
return true; return true;
} }
String ipaddress = IPUtil.getIpAddr(request);

String url = request.getRequestURL().toString(); String url = request.getRequestURL().toString();
if(url.contains("pvlog")) { if(url.contains("pvlog")) {
// pvlog不检查幂等 // pvlog不检查幂等
return true; return true;
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();



sb.append(url); sb.append(url);

sb.append("method=").append(request.getMethod()).append("&"); sb.append("method=").append(request.getMethod()).append("&");

String ipaddress = IPUtil.getIpAddr(request);
sb.append("ip=").append(ipaddress).append("&"); sb.append("ip=").append(ipaddress).append("&");


final Enumeration parameterNames = request.getParameterNames(); final Enumeration parameterNames = request.getParameterNames();
@@ -61,7 +60,7 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
String parameter = request.getParameter(key); String parameter = request.getParameter(key);
sb.append(key).append("=").append(parameter).append("&"); sb.append(key).append("=").append(parameter).append("&");
} }
/*
InputStream inStream = request.getInputStream(); InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
@@ -69,14 +68,13 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
while ((len = inStream.read(buffer)) != -1) { while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len); outSteam.write(buffer, 0, len);
} }
String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
String resultBody = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
inStream.close(); inStream.close();
outSteam.close(); outSteam.close();


sb.append(resultxml);
*/
sb.append(resultBody);


String key = "request:" + HashUtil.md5(sb.toString());
String key = "request: " + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");


+ 12
- 0
mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java Ver fichero

@@ -7,9 +7,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.iformall.interceptor.AuthorizationInterceptor; import com.iformall.interceptor.AuthorizationInterceptor;
import com.iformall.interceptor.HttpServletRequestWrapperFilter;
import com.iformall.interceptor.RequestInterceptor; import com.iformall.interceptor.RequestInterceptor;
import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@@ -99,4 +102,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
jackson2HttpMessageConverter.setObjectMapper(objectMapper); jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter); converters.add(jackson2HttpMessageConverter);
} }

@Bean
public FilterRegistrationBean<HttpServletRequestWrapperFilter> Filters() {
FilterRegistrationBean<HttpServletRequestWrapperFilter> registrationBean = new FilterRegistrationBean<HttpServletRequestWrapperFilter>();
registrationBean.setFilter(new HttpServletRequestWrapperFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("koalaSignFilter");
return registrationBean;
}
} }

+ 77
- 0
mallinkBApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java Ver fichero

@@ -0,0 +1,77 @@
package com.iformall.interceptor;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String body;

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuffer stringBuilder = new StringBuffer();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
char[] charBuffer = new char[1024];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(body.getBytes("utf-8"));
return new ServletInputStream() {
@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 byteArrayInputStream.read();
}
};
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}

public String getBody() {
return this.body;
}
}

+ 33
- 0
mallinkBApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java Ver fichero

@@ -0,0 +1,33 @@
package com.iformall.interceptor;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HttpServletRequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
}
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}

}

@Override
public void destroy() {

}
}

+ 4
- 5
mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Ver fichero

@@ -55,7 +55,7 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
String parameter = request.getParameter(key); String parameter = request.getParameter(key);
sb.append(key).append("=").append(parameter).append("&"); sb.append(key).append("=").append(parameter).append("&");
} }
/*
InputStream inStream = request.getInputStream(); InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
@@ -63,14 +63,13 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
while ((len = inStream.read(buffer)) != -1) { while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len); outSteam.write(buffer, 0, len);
} }
String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
String resultBody = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
inStream.close(); inStream.close();
outSteam.close(); outSteam.close();


sb.append(resultxml);
*/
sb.append(resultBody);


String key = "request:" + HashUtil.md5(sb.toString());
String key = "request: " + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");


+ 12
- 0
mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java Ver fichero

@@ -7,9 +7,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.iformall.interceptor.AuthorizationInterceptor; import com.iformall.interceptor.AuthorizationInterceptor;
import com.iformall.interceptor.HttpServletRequestWrapperFilter;
import com.iformall.interceptor.RequestInterceptor; import com.iformall.interceptor.RequestInterceptor;
import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@@ -99,4 +102,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
jackson2HttpMessageConverter.setObjectMapper(objectMapper); jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter); converters.add(jackson2HttpMessageConverter);
} }

@Bean
public FilterRegistrationBean<HttpServletRequestWrapperFilter> Filters() {
FilterRegistrationBean<HttpServletRequestWrapperFilter> registrationBean = new FilterRegistrationBean<HttpServletRequestWrapperFilter>();
registrationBean.setFilter(new HttpServletRequestWrapperFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("koalaSignFilter");
return registrationBean;
}
} }

+ 77
- 0
mallinkCApi/src/main/java/com/iformall/interceptor/BodyReaderHttpServletRequestWrapper.java Ver fichero

@@ -0,0 +1,77 @@
package com.iformall.interceptor;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String body;

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuffer stringBuilder = new StringBuffer();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
char[] charBuffer = new char[1024];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(body.getBytes("utf-8"));
return new ServletInputStream() {
@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 byteArrayInputStream.read();
}
};
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}

public String getBody() {
return this.body;
}
}

+ 33
- 0
mallinkCApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java Ver fichero

@@ -0,0 +1,33 @@
package com.iformall.interceptor;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HttpServletRequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
}
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}

}

@Override
public void destroy() {

}
}

+ 4
- 5
mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Ver fichero

@@ -55,7 +55,7 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
String parameter = request.getParameter(key); String parameter = request.getParameter(key);
sb.append(key).append("=").append(parameter).append("&"); sb.append(key).append("=").append(parameter).append("&");
} }
/*
InputStream inStream = request.getInputStream(); InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
@@ -63,14 +63,13 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {
while ((len = inStream.read(buffer)) != -1) { while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len); outSteam.write(buffer, 0, len);
} }
String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
String resultBody = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
inStream.close(); inStream.close();
outSteam.close(); outSteam.close();


sb.append(resultxml);
*/
sb.append(resultBody);


String key = "request:" + HashUtil.md5(sb.toString());
String key = "request: " + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");


Cargando…
Cancelar
Guardar