【问题标题】:Convert HttpServletResponse to String将 HttpServletResponse 转换为字符串
【发布时间】:2017-02-23 11:25:13
【问题描述】:

我在定义拦截器的 Spring Boot 应用程序中工作。在拦截器的“postHandle”方法中,我得到了一个 HttpServletRequest 和 HttpServletResponse。如何将 HttpServletResponse 转换为字符串?

这是我迄今为止尝试过的:

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse res, Object o, ModelAndView mav) throws Exception {

OutputStream outputStream = res.getOutputStream();

///Convert this outputstream to String

}

这个 OutputStream 是一个 ServletOutputstream。我无法将其转换为 BytearrayOutputStream。如果我能做到这一点,我可以将其转换为字符串。

【问题讨论】:

  • 我想获取该流的内容。可以吗?
  • 也许有过滤器...
  • @Snehal Patel,我看到了这个问题。但我使用的是拦截器而不是过滤器。

标签: java outputstream


【解决方案1】:

有 2 个选项可以做到这一点 .1 -

public class MyFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {
}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(baos);

HttpServletResponse wrappedResp = new HttpServletResponseWrapper((HttpServletResponse) servletResponse) {
    @Override
    public PrintWriter getWriter() {
        return pw;
    }

    @Override
    public ServletOutputStream getOutputStream() {
        return new ServletOutputStream() {
            @Override
            public void write(int b) {
                baos.write(b);
            }
        };
    }
};

filterChain.doFilter(servletRequest, wrappedResp);
byte[] bytes = baos.toByteArray();
 String responseStr = new String(bytes);
servletResponse.getOutputStream().write(bytes);
}

 public void destroy() {}

 public static class ByteArrayPrintWriter extends PrintWriter {
 public ByteArrayPrintWriter(OutputStream out) {
    super(out);
 }
 }
 }

2 方法很简单,但可以使用 spring-web-4*.jar 版本

HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);

    Instant start = Instant.now();

    filterChain.doFilter(requestWrapper, responseWrapper);

    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();

    byte[] responseArray = responseWrapper.getContentAsByteArray();
    String responseStr = new String(responseArray, responseWrapper.getCharacterEncoding());

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2019-01-05
    • 2016-05-19
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多