HandlerInterceptor 获取 HttpServletResponse 返回值
时间: 2023-08-18 10:35:49 浏览: 181
在`HandlerInterceptor`中获取`HttpServletResponse`返回值是比较困难的,因为`HandlerInterceptor`是在`DispatcherServlet`处理完请求后执行的,而返回值是在`DispatcherServlet`将响应写回客户端时才生成的。
不过,你可以通过在`HandlerInterceptor`中创建一个子类`HttpServletResponseWrapper`的方式来获取响应值。`HttpServletResponseWrapper`是一个包装类,它可以包装原始的`HttpServletResponse`对象,并重写其中一些方法以获取响应值。
具体实现方式如下:
1. 创建一个类`ResponseWrapper`,继承`HttpServletResponseWrapper`,并添加一个成员变量`outputStream`:
```
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream outputStream;
public ResponseWrapper(HttpServletResponse response) {
super(response);
outputStream = new ByteArrayOutputStream();
}
}
```
2. 重写`getOutputStream`方法,返回一个包装了原始`OutputStream`的`ServletOutputStream`:
```
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStreamWrapper(outputStream);
}
```
3. 创建一个类`ServletOutputStreamWrapper`,继承`ServletOutputStream`,并添加一个成员变量`outputStream`:
```
public class ServletOutputStreamWrapper extends ServletOutputStream {
private ByteArrayOutputStream outputStream;
public ServletOutputStreamWrapper(ByteArrayOutputStream outputStream) {
this.outputStream = outputStream;
}
@Override
public void write(int b) throws IOException {
outputStream.write(b);
}
}
```
4. 在`HandlerInterceptor`中创建一个`ResponseWrapper`对象,并将它传递给`HandlerExecutionChain`的`applyPostHandle`方法:
```
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
ResponseWrapper responseWrapper = new ResponseWrapper(response);
HandlerExecutionChain chain = (HandlerExecutionChain) request.getAttribute(HandlerMapping.PROCESSOR);
chain.applyPostHandle(request, responseWrapper, modelAndView);
String responseBody = responseWrapper.getOutputStream().toString();
// 处理响应值
}
```
这样,就可以在`HandlerInterceptor`中获取到响应值了。需要注意的是,这种方式只适用于响应值是文本或者JSON格式的情况。如果响应值是二进制数据,需要进行适当的修改。
阅读全文