springboot 通过filter修改请求体和响应体

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;
}
}

原文地址:https://www.cnblogs.com/myDreamWillCometrue/p/15490217.html