修改post请求参数的请参照我的https://blog.csdn.net/qq_34468174/article/details/106665093,两者进行整合也许可以实现你需要的功能,比如根据不同请求方式、请求头分别采用不同逻辑处理请求参数!
1.场景:将前端请求的post请求全部改为 application/json的请求方式,因为有后端项目使用的是@RequestBody注解,作为中间件,需要将(其他服务)转发过来的请求更改为 application/json,控制层正常接收。
2.实现过程:研究request请求源码得出
3.实现代码
自定义request对象:
/**
* bodyReader包装request,对宝物基座的数据进行处理,宝物基座不支持json,若需要只需要简单实现即可
*
* @author qiaofeng
*/
@Slf4j
public class BodyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String contentType = "application/json";
private Map<String, String> headerMap = new HashMap<>();
@Nullable
private ServletInputStream body;
public BodyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
setHeaderMap(request);
//此处可以对数据做任何修改后,再放入到body
String dataInfo = request.getParameter("data");
if (StringUtils.isEmpty(dataInfo)) {
return;
}
ByteArrayInputStream delegate = new ByteArrayInputStream(dataInfo.getBytes(StandardCharsets.UTF_8));
body = new ServletInputStream() {
@Override
public int read() {
return delegate.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
throw new UnsupportedOperationException();
}
};
}
@Override
public ServletInputStream getInputStream() {
return body;
}
/**
* add a header with given name and value
*/
private void addHeader(String name, String value) {
headerMap.put(name, value);
}
@Override
public String getHeader(String name) {
String headerValue = super.getHeader(name);
if (headerMap.containsKey(name)) {
headerValue = headerMap.get(name);
}
return headerValue;
}
/**
* get the Header names
*/
@Override
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
names.addAll(headerMap.keySet());
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
List<String> values = Collections.list(super.getHeaders(name));
if (headerMap.containsKey(name)) {
values = Collections.singletonList(headerMap.get(name));
}
return Collections.enumeration(values);
}
private void setHeaderMap(HttpServletRequest request) {
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value = request.getHeader(name);
addHeader(name, value);
}
addHeader("content-type", contentType);
}
public String getContentType(){
return contentType;
}
拦截器
/**
* HttpServletRequest替换的filter
*
* @author qiaofeng
*/
@Component
@Slf4j
public class HttpServletRequestReplacedFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//判断宝物基座的逻辑
String methodType = request.getMethod().toUpperCase();
System.out.println("请求方式为:" + methodType);
if ((("POST".equals(methodType)) || ("DELETE".equals(methodType)) || ("PUT".equals(methodType))) && isBaoWuTransmit(request)) {
ServletRequest requestWrapper = new BodyHttpServletRequestWrapper(request);
filterChain.doFilter(requestWrapper, response);
} else{
filterChain.doFilter(request, response);
}
}
private boolean isBaoWuTransmit(HttpServletRequest request) {
boolean baoWu = false;
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String headerName = (String) e.nextElement();
if ("appcode".equals(headerName)){
baoWu = true;
}
}
return baoWu;
}