如何在筛选器中获取筛选器httpservletresponse outputstream错误消息
问题描述:
我使用spring 4和筛选器我在servletResponse中得到了一些错误响应。它包含带有错误消息的outputstream。 如何在输出流中获取此错误消息并审核到我的应用程序?如何在筛选器中获取筛选器httpservletresponse outputstream错误消息
try{
filterChain.doFilter(wrappedRequest, servletResponse);
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
LOGGER.info("Basic Authenticate HttpServletResponse code {}"+httpServletResponse.getStatus());
httpServletResponse.getOutputStream();
// I need to read this outputstream, its contains error message.?
}catch(Exception e){
LOGGER.error("Error Basic Authenticate Error :{}", e);
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
AtomicInteger statusCode = new AtomicInteger(httpServletResponse.getStatus());
Response response = ResponseUtil.populateResponse(statusCode, e.getMessage().toString(), 0);
httpServletResponse.sendError(httpServletResponse.getStatus(), e.getMessage());
auditService.updateRestAuditRecord(auditId,StringUtils.EMPTY, response);
}
答
关键是装饰者类HttpServletResponseWrapper
。根据您的具体需求调整这些步骤:
- 完全读取您想审核的流类似于字节缓冲区。
- 做你的审计任务。
- 扩展
HttpServletResponseWrapper
,覆盖getOutputStream()
并返回一个扩展名为ServletOutputStream
的扩展字节缓冲区。 - 将
HttpServletResponseWrapper
传递给链中的下一个下游过滤器。
好的,我会试试..谢谢 –
我尝试下面这段代码,byteArr是空的。 1. HtmlResponseWrapper responseWrapper = new HtmlResponseWrapper(httpServletResponse); \t \t 2. ServletOutputStream sout = responseWrapper.getOutputStream(); \t \t \t ByteArrayOutputStream capture = new 3. ByteArrayOutputStream(responseWrapper.getBufferSize()); \t \t \t capture.writeTo(sout); \t \t \t sout.flush(); \t \t \t sout.close(); \t \t \t \t \t \t byte [] byteArr = capture.toByteArray(); –