为了 重写 ServletInputStream 的 getInputStream()方法,我们需要自定义一个 HttpServletRequestWrapper
package com.xxx.emes.dc.server.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StreamUtils;
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.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
{
private byte[] body;
//private Map> initMap = new HashMap<>();
public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
//初始化需要处理的链接和参数名称
//initMap();
body = StreamUtils.copyToByteArray(request.getInputStream());
// if(initMap.containsKey(request.getRequestURI())){
// body = StreamUtils.copyToByteArray(request.getInputStream());
String bodyStr = new String(body, request.getCharacterEncoding());
log.info("原始参数:"+bodyStr);
JSonObject json = JSON.parseObject(bodyStr);
JSonObject requestJson = json.getJSonObject("request");
body = requestJson.getString("body").getBytes(StandardCharsets.UTF_8);
log.info("原始参数内的请求体body:"+ new String(body, request.getCharacterEncoding()));
// initMap.get(request.getRequestURI()).forEach((key,value)->{
// if(StringUtils.notBlank(json.getString(key))){
// json.put(key,json.getString(key) + value);
// }
// });
// bodyStr = json.toJSonString();
// body = bodyStr.getBytes();
// }
}
@Override
public ServletInputStream getInputStream() throws IOException {
InputStream bodyStream = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bodyStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
@Override
public BufferedReader getReader() throws IOException {
InputStream bodyStream = new ByteArrayInputStream(body);
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
然后定义一个 DispatcherServlet子类来分派 上面自定义的 HttpServletRequestWrapper
package com.xxx.emes.dc.server.config;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyDispatcherServlet extends DispatcherServlet
{
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
super.doDispatch(new MyHttpServletRequestWrapper(request), response);
}
}
然后配置一下
package com.xxx.emes.dc.server.config;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
}
package com.penghai.emes.dc.server.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor())
//.addPathPatterns("/**")//不做过滤
.addPathPatterns("/agvLiKu/agvLiKuTaskCallBack");
}
@Bean
@Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public DispatcherServlet dispatcherServlet() {
return new MyDispatcherServlet();
}
}
最后把需要过滤的请求Controller接口地址配置到.addPathPatterns处,即可实现对接口请求参数的拦截。



