为了账号安全,请及时绑定邮箱和手机立即绑定

记录 Spring REST API

记录 Spring REST API

拉丁的传说 2022-01-12 10:09:14
我有自定义过滤器,我想从请求中记录正文。但是当我使用ContentCachingRequestWrapper并尝试调用时,getContentAsByteArray()我总是得到一个空数组。@Componentpublic 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,但遇到了同样的问题。我究竟做错了什么?感谢帮助。
查看完整描述

2 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您可以通过在带@Configuration注释的类中注册此 bean 来使用现有的 spring 实现:


@Bean

public static Filter requestLoggingFilter() {

    final CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();

    loggingFilter.setIncludePayload(true);

    loggingFilter.setMaxPayloadLength(512);


    return loggingFilter;

}


查看完整回答
反对 回复 2022-01-12
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

虽然我建议使用 NiVer 的答案,但我一直在研究为什么会出现这个问题,我终于可以给你一个答案。

当您创建一个新的时ContentCachingRequestWrapper,内部ByteArrayOutputStream被初始化但没有数据被复制到它。身上只有写入ByteArrayOutputStream当你打电话getParametergetParameterMap()getParameterNames()getParameterValues(String name)方法,即使这样,如果内容类型包含的数据只复制application/x-www-form-urlencoded


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号