利用HttpServletRequestWrapper实现请求参数扩展处理
对HttpServletRequestWrapper包装实现
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
*
* http请求主体包装器
*
* @author 唐海斌
* @date 2021/12/16 14:38
*/
public class BodyHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* 请求参数字节数组
*/
private final byte [] bodyBytes;
public BodyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
BufferedInputStream bufferedInputStream = new BufferedInputStream(request.getInputStream());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte [] byteBuffer = new byte[1024];
int len;
while ((len = bufferedInputStream.read(byteBuffer, 0, 1024)) != -1) {
byteArrayOutputStream.write(byteBuffer, 0, len);
}
bodyBytes = byteArrayOutputStream.toByteArray();
}
@Override
public ServletInputStream getInputStream() throws IOException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bodyBytes);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
}
新增过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
*
* 参数包装过滤器
*
* @author 唐海斌
* @date 2021/12/16 15:10
*/
public class BodyWrapperFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
filterChain.doFilter(new BodyHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
新增拦截器
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
*
* 参数日志拦截器
*
* @author: haibin.tang
* @date: 2021/3/4
*/
@Slf4j
public class ParamLogInterceptor extends HandlerInterceptorAdapter {
private final static String LOG_TEMPLATE = "请求资源[%s], 请求参数[%s], 请求主体 %s";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
byte [] byteBuffer = new byte[1024];
int len;
StringBuilder bodyBuilder = new StringBuilder();
ServletInputStream inputStream = request.getInputStream();
while ((len = inputStream.read(byteBuffer, 0, 1024)) != -1) {
bodyBuilder.append(new String(byteBuffer, 0, len));
}
log.info(String.format(LOG_TEMPLATE, request.getRequestURI(), parseParamMap(request), bodyBuilder));
return super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
private String parseParamMap(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
if (MapUtils.isEmpty(parameterMap)) {
return null;
}
StringBuilder paramBuilder = new StringBuilder();
parameterMap.forEach((key, value) -> {
paramBuilder.append(key).append("=").append(JSONObject.toJSONString(value));
});
return paramBuilder.toString();
}
}
配置拦截器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 拦截器配置
*/
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(paramLogInterceptor()).addPathPatterns("/trace/**");
}
@Bean
public ParamLogInterceptor paramLogInterceptor() {
return new ParamLogInterceptor();
}
/**
* 解决跨域问题
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
}
配置过滤器
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Collections;
/**
* @author 唐海斌
* @date 2021/12/16 15:16
*/
@Configuration
public class FilterConfiguration {
@Bean
FilterRegistrationBean<BodyWrapperFilter> filterFilterRegistrationBean() {
FilterRegistrationBean<BodyWrapperFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new BodyWrapperFilter());
bean.setOrder(-1);
bean.setUrlPatterns(Collections.singleton("/trace/*"));
return bean;
}
}