HandlerInterceptorAdapter preHandle 拦截并重写 post 请求 json参数 完整
时间: 2024-01-26 09:41:21 浏览: 122
HandlerInterceptorAdapter 是 Spring MVC 中提供的拦截器,可以在请求处理之前或之后对请求进行拦截和处理。
下面是一个示例,演示了如何使用 HandlerInterceptorAdapter 对 POST 请求进行拦截并重写 JSON 参数:
```java
public class JsonParamInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals("POST")) {
String contentType = request.getHeader("Content-Type");
if (contentType != null && contentType.contains("application/json")) {
// 读取 JSON 参数
String json = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
JSONObject jsonObj = JSONObject.parseObject(json);
// 修改 JSON 参数
jsonObj.put("newKey", "newValue");
// 重写请求参数
String newJson = jsonObj.toJSONString();
request = new CustomHttpServletRequest(request, newJson.getBytes(StandardCharsets.UTF_8));
}
}
return true;
}
private static class CustomHttpServletRequest extends HttpServletRequestWrapper {
private final byte[] body;
public CustomHttpServletRequest(HttpServletRequest request, byte[] body) {
super(request);
this.body = body;
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new ServletInputStreamWrapper(body);
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream(), StandardCharsets.UTF_8));
}
}
private static class ServletInputStreamWrapper extends ServletInputStream {
private final ByteArrayInputStream bis;
public ServletInputStreamWrapper(byte[] buffer) {
this.bis = new ByteArrayInputStream(buffer);
}
@Override
public int read() throws IOException {
return bis.read();
}
}
}
```
上述代码中,我们在 `preHandle` 方法中判断请求是否为 POST 请求,并且 Content-Type 是否为 application/json。如果是,就读取 JSON 参数,并且修改其中的一个字段,最后重写请求参数,然后将修改后的请求继续传递给后续的处理器。
注意,为了重写请求参数,我们需要自定义一个 HttpServletRequestWrapper,并且重写 getInputStream 和 getReader 方法。这样就可以将修改后的请求参数传递给后续的处理器了。
当然,这只是一个简单的示例,实际场景中可能需要更复杂的处理逻辑。