猿问

记录 Spring REST API

我有自定义过滤器,我想从请求中记录正文。但是当我使用ContentCachingRequestWrapper并尝试调用时,getContentAsByteArray()我总是得到一个空数组。


@Component

public class CustomFilter implements Filter {


    private final Logger log = LoggerFactory.getLogger(CustomFilter.class);


    @Override

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {


        HttpServletRequest request = (HttpServletRequest) req;

        HttpServletResponse response = (HttpServletResponse) res;

        HttpServletRequest requestToCache = new ContentCachingRequestWrapper(request);


        chain.doFilter(req, res);


       log.info(getRequestData(requestToCache));

    }


    @Override

    public void init(FilterConfig filterConfig) {

    }


    @Override

    public void destroy() {

    }


    public static String getRequestData(final HttpServletRequest request) throws UnsupportedEncodingException {

        String payload = null;

        ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);

        if (wrapper != null) {

            byte[] buf = wrapper.getContentAsByteArray();

            if (buf.length > 0) {

                payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());

            }

        }

        return payload;

    }

  }

我也尝试过 create Interceptor,但遇到了同样的问题。我究竟做错了什么?感谢帮助。


拉丁的传说
浏览 285回答 2
2回答

扬帆大鱼

您可以通过在带@Configuration注释的类中注册此 bean 来使用现有的 spring 实现:@Beanpublic static Filter requestLoggingFilter() {    final CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();    loggingFilter.setIncludePayload(true);    loggingFilter.setMaxPayloadLength(512);    return loggingFilter;}

一只萌萌小番薯

虽然我建议使用 NiVer 的答案,但我一直在研究为什么会出现这个问题,我终于可以给你一个答案。当您创建一个新的时ContentCachingRequestWrapper,内部ByteArrayOutputStream被初始化但没有数据被复制到它。身上只有写入ByteArrayOutputStream当你打电话getParameter,getParameterMap(),getParameterNames()或getParameterValues(String name)方法,即使这样,如果内容类型包含的数据只复制application/x-www-form-urlencoded。
随时随地看视频慕课网APP

相关分类

Java
我要回答