解决方案:WebMvcConfigurer + @WebFilter
注意事项@WebFilter不生效,则在启动类添加@ServletComponentScan
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* @author : huqy
* @description
* @date : 2021/9/16
*/
@Configuration
@Slf4j
public class CustomizeConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加自定义拦截器
registry.addInterceptor(new CustomizeInterceptor());
}
/**
* 可在此处对入参body、header做统一拦截处理
*/
class CustomizeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//CustomizeWrapper 自定义的包装器,用以解决HttpServletRequest流不可重复读取问题
CustomizeWrapper wrapper = (CustomizeWrapper)request;
//获取requestBody
String s = new String(wrapper.getBody());
//TODO 业务处理
Map map = JSON.parseObject(s, Map.class);
log.info("--RequestBody-->",map);
return true;
}
}
/**
* 包装器
*/
static class CustomizeWrapper extends HttpServletRequestWrapper {
/**
* 储存body副本
*/
private byte[] body;
public CustomizeWrapper(HttpServletRequest request) throws IOException {
super(request);
//从request流中读取RequestBody
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8));
StringBuilder bodyStr = new StringBuilder();
String line;
while ((line=br.readLine()) != null){
bodyStr.append(line);
}
body = bodyStr.toString().getBytes(StandardCharsets.UTF_8);
}
/**
* 对外提供副本获取接口
* @return
* @throws IOException
*/
public byte[] getBody() throws IOException {
return body;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
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 bais.read();
}
};
}
}
}
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author : huqy
* @description
* @date : 2021/9/16
*/
@WebFilter(urlPatterns = "/*")
public class CustomizeFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//对HttpServletRequest进行包装使其可以重复读取
CustomizeConfig.CustomizeWrapper myHttpWrapper = new CustomizeConfig.CustomizeWrapper((HttpServletRequest) servletRequest);
filterChain.doFilter(myHttpWrapper, servletResponse);
}
}
@SpringBootApplication
@ServletComponentScan
public class HApplication {
public static void main(String[] args) {
SpringApplication.run(HApplication.class, args);
}
}