【问题标题】:How to read httpServletResponse in the interceptor?如何在拦截器中读取 httpServletResponse?
【发布时间】:2018-02-03 09:28:43
【问题描述】:

我有一个 Spring Boot 应用程序。现在我需要在拦截器中读取请求和响应。我使用HttpServletRequestWrapper 替换DispatcherServlet 中的请求

@Component("dispatcherServlet")
public class FofDisPatcherServlet extends DispatcherServlet {
    @Override
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        MultiReadHttpServletRequest requestWrapper = null;
        try {
            requestWrapper = new MultiReadHttpServletRequest(request);
            super.doDispatch(requestWrapper, response);
        } catch (Exception e) {
            super.doDispatch(request,response);
        }
    }
}

在我的拦截器中,我可以读取请求正文。但是当我想读取响应正文时,它不起作用。当我替换 CustomerDispatcherServlet 中的响应时,我没有得到任何响应。我尝试过 ContentCachingResponseWrapper ,但我得到了带有“”的有效负载。

这是一个老问题。我已经搜索了一些问题,但没有找到合适的解决方案。

我知道我可以用AOP 解决问题。但是我想知道如何在拦截器中解决问题?


这是我的拦截器代码

public class CustomerInterceptor extends HandlerInterceptorAdapter{
    @Override
    public void postHandle(...){
        MultiReadHttpServletRequest req = (MultiReadHttpServletRequest) request;
        ContentCachingResponseWrapper res = new ContentCachingResponseWrapper(response);
        Byte[] body = res. getContentAsByteArray();
        ...
    }
}

我得到的身体是[]。

【问题讨论】:

  • 你能分享更多你的代码吗?您是如何使用ContentCachingResponseWrapper 的?正如 javadoc 所说,您应该在其上调用 getContentAsByteArray() 方法来检索内容
  • 是的,我使用getContentAsByteArray(),但我对“”感到满意。
  • 能否分享拦截器代码,问题出在拦截器部分。
  • 您应该将响应对象包装在 servlet 过滤器中,而不是在拦截器中。
  • @Leffchik 但是为什么它在拦截器中不起作用。我在文档中没有找到它。

标签: spring spring-mvc spring-boot


【解决方案1】:

试试这个:

@Component("dispatcherServlet")
public class FofDisPatcherServlet extends DispatcherServlet {
    @Override
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        MultiReadHttpServletRequest requestWrapper = null;
        try {
            requestWrapper = new MultiReadHttpServletRequest(request);
            super.doDispatch(requestWrapper, new ContentCachingResponseWrapper(request));
        } catch (Exception e) {
            super.doDispatch(request,response);
        }
    }
}

.

public class CustomerInterceptor extends HandlerInterceptorAdapter{
    @Override
    public void postHandle(..., HttpServletResponse response){
        if (response instanceof ContentCachingResponseWrapper) {
            Byte[] body = ((ContentCachingResponseWrapper)response). getContentAsByteArray();
        }
        ...
    }
}

【讨论】:

    【解决方案2】:

    几天后。我找到了答案。在CustomerDispatcherServlet我应该添加responseWrapper.copyBodyToResponse()

    CustomerDIspatcherServlet 是这样的:

    @Component("dispatcherServlet")
    public class FofDisPatcherServlet extends DispatcherServlet {
        @Override
        protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
            MultiReadHttpServletRequest requestWrapper = null;
            try {
                requestWrapper = new MultiReadHttpServletRequest(request);
                if (!(response instanceof ContentCachingResponseWrapper)) {
                    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
                    super.doDispatch(requestWrapper, responseWrapper);
                    responseWrapper.copyBodyToResponse();
                }else {
                    super.doDispatch(requestWrapper, response);
                }
            } catch (Exception e) {
                super.doDispatch(request, response);
            }
        }
    }    
    

    【讨论】:

      【解决方案3】:

      错误在您的代码中

      public class CustomerInterceptor extends HandlerInterceptorAdapter{
          @Override
          public void postHandle((HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
              MultiReadHttpServletRequest req = (MultiReadHttpServletRequest) request;
              ContentCachingResponseWrapper res = new ContentCachingResponseWrapper(response);
              Byte[] body = res. getContentAsByteArray();
              ...
          }
      }
      

      您正在 ContentCachingResponseWrapper 中传递请求。

      this question 非常相似的问题。

      【讨论】:

      • 哦,在我的代码中,我使用了response。在我写错的问题中,对不起。
      猜你喜欢
      • 2014-12-31
      • 2018-05-17
      • 1970-01-01
      • 2017-02-19
      • 2019-07-15
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多