handlerinterceptor获取返回值
时间: 2024-02-27 07:40:24 浏览: 26
HandlerInterceptor拦截器的preHandle方法里无法直接获取到目标方法的返回值,因为该方法在目标方法执行前被调用。如果需要获取目标方法的返回值,可以使用拦截器的postHandle方法或者afterCompletion方法,这两个方法都是在目标方法执行后被调用,可以通过`ModelAndView`对象的`getModel()`方法获取到目标方法返回的结果。另外,也可以使用AOP切面来实现获取目标方法的返回值。
相关问题
HandlerInterceptor 获取 HttpServletResponse 返回值
在`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格式的情况。如果响应值是二进制数据,需要进行适当的修改。
拦截器获取controller返回值
在拦截器中获取 Controller 的返回值可以通过实现 postHandle 方法来实现。postHandle 方法会在请求处理完成后被调用,可以获取到请求处理的结果 ModelAndView 对象。以下是示例代码:
```java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理前执行拦截逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理完成后执行拦截逻辑
if (modelAndView != null) {
Object result = modelAndView.getModel().get("result");
// 处理获取到的返回值
// ...
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在请求完成后执行拦截逻辑
}
}
```
需要注意的是,如果 Controller 返回的是 JSON 数据等非 ModelAndView 对象,可以在拦截器中通过 HttpServletResponse 对象获取到响应内容,再进行解析。同时,如果存在多级拦截器,需要在 postHandle 方法中进行判断和处理。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)