1.新建ModifyRequestBodyWrapper.class
package com.example.my_project.filter;
import org.apache.commons.io.IOUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 自定义HttpServletRequestWrapper 用于修改请求体
*/
public class ModifyRequestBodyWrapper extends HttpServletRequestWrapper {
private String oldRequestBody;
private String newRequestBody;
public ModifyRequestBodyWrapper(HttpServletRequest request) throws IOException {
super(request);
this.oldRequestBody = IOUtils.toString(request.getInputStream(),request.getCharacterEncoding());
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new ServletInputStream() {
final ByteArrayInputStream bis = new ByteArrayInputStream(newRequestBody.getBytes(StandardCharsets.UTF_8));
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return bis.read();
}
};
}
public String getOldRequestBody() {
return oldRequestBody;
}
public void setOldRequestBody(String oldRequestBody) {
this.oldRequestBody = oldRequestBody;
}
public String getNewRequestBody() {
return newRequestBody;
}
public void setNewRequestBody(String newRequestBody) {
this.newRequestBody = newRequestBody;
}
}
2.新建ModifyResponseBodyWrapper.class
package com.example.my_project.filter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
* 自定义HttpServletResponseWrapper 修改响应体
*/
public class ModifyResponseBodyWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream bos;
public ModifyResponseBodyWrapper(HttpServletResponse response) {
super(response);
this.bos = new ByteArrayOutputStream();
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return true;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) throws IOException {
bos.write(b);
}
@Override
public void write(byte[] b) throws IOException {
bos.write(b);
}
};
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new OutputStreamWriter(bos));
}
public String getResponseBody() throws IOException {
ServletOutputStream outputStream = this.getOutputStream();
outputStream.flush();
PrintWriter writer = this.getWriter();
writer.flush();
return bos.toString(this.getCharacterEncoding());
}
}
3.新建HttpRequestFilter.class
package com.example.my_project.filter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* 修改请求体响应体
*/
@Slf4j
public class HttpRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ModifyRequestBodyWrapper modifyRequestBodyWrapper = new ModifyRequestBodyWrapper(request);
String oldRequestBody = modifyRequestBodyWrapper.getOldRequestBody();
log.info("path:{}",request.getRequestURI());
log.info("oldRequestBody:{}",oldRequestBody);
String newRequestBody = changeRequestBody(oldRequestBody);
log.info("newRequestBody:{}",newRequestBody);
modifyRequestBodyWrapper.setNewRequestBody(newRequestBody);
ModifyResponseBodyWrapper modifyResponseBodyWrapper = new ModifyResponseBodyWrapper(response);
filterChain.doFilter(modifyRequestBodyWrapper,modifyResponseBodyWrapper);
String oldResponseBody = modifyResponseBodyWrapper.getResponseBody();
log.info("oldResponseBody:{}",oldResponseBody);
String newResponseBody = changeResponseBody(oldResponseBody);
log.info("newResponseBody:{}",newResponseBody);
response.setContentType(request.getContentType());
byte[] responseBodyData = newResponseBody.getBytes(StandardCharsets.UTF_8);
ServletOutputStream out = response.getOutputStream();
out.write(responseBodyData);
}
/**
* 修改请求体
* @param oldRequestBody 修改前的请求体
* @return 修改后的请求体
*/
public String changeRequestBody(String oldRequestBody) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, String> stringStringMap =objectMapper.readValue(oldRequestBody, new TypeReference<Map<String, String>>() {
});
stringStringMap.put("password","34566");
return objectMapper.writeValueAsString(stringStringMap);
}
/**
* 修改响应体
* @param oldResponseBody 修改前的响应体
* @return 修改够的响应体
*/
public String changeResponseBody(String oldResponseBody){
return "00000000";
}
}
4.新建FilterConfig.class
package com.example.my_project.config;
import com.example.my_project.filter.HttpRequestFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.List;
/**
* 过滤器配置
*/
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new HttpRequestFilter());
filterFilterRegistrationBean.setOrder(-1);
//过滤的请求
filterFilterRegistrationBean.setUrlPatterns(List.of("/*"));
return filterFilterRegistrationBean;
}
}