1,用OncePerRequestFilter 过滤器,利用inputStream 流过去json参数
@Component
@Slf4j
public class ParamFilter extends OncePerRequestFilter {
@Value("${privateKey}")
private String privateKey;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
String method = request.getMethod();
String requestURI = request.getRequestURI();
// String contentType = request.getContentType();
if (RequestMethod.GET.toString().equals(method)) {
chain.doFilter(request, response);
}
//body形式(json)
if (RequestMethod.POST.toString().equals(method) && requestURI.startsWith("/openApi")) {
//获取request的body参数
String postContent = getBody(request);
//如果body中存在数据放入HttpServletRequest
if (StringUtils.isNotEmpty(postContent)) {
//参数中放入新的参数
EncryptionUtil encryptionUtil = new EncryptionUtil();
String body = encryptionUtil.decodeUrlSafeMingNew(postContent.trim(), privateKey);
//将参数放入重写的方法中
request = new BodyRequestWrapper(request, body);
}
//form表单形式
}
chain.doFilter(request, response);
}
//获取Request的body数据
private String getBody(ServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return stringBuilder.toString();
}
}
修改参数
public class BodyRequestWrapper extends HttpServletRequestWrapper {
// 存放JSON数据主体
private String body;
public BodyRequestWrapper(HttpServletRequest request, String context) {
super(request);
body = context;
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
return servletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
}