当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalStateExctive:在为当前请求调用getReader()之后,无法调用getInputStream()

邹山
2023-03-14

我写了拦截器:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    log.info("[pre-handle] method: {}\tURL: {}", request.getMethod(), request.getRequestURL());
    if (HttpMethod.POST.name().equals(request.getMethod())) {
        log.info(request.getReader().lines().collect(Collectors.joining()));
    }
    return true;
}

但当我试图调用控制器时,异常抛出:

java.lang.IllegalStateExctive:在为当前请求调用getReader()之后,无法调用getInputStream()

据我所知,getReader()调用会关闭InputStream

共有1个答案

曹普松
2023-03-14

要多次读取请求,您需要在第一次读取请求之前缓存请求。更多信息可以在这里阅读。

Spring MVC提供了ContentCachingRepestWrapper类,它是围绕原始HttpServletRequest对象的包装器。

要使用它,我们必须首先创建一个Web过滤器,该过滤器包装原始HttpServletRequest:

@Component
public class CachingRequestBodyFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
      throws IOException, ServletException {
        HttpServletRequest currentRequest = (HttpServletRequest) servletRequest;
        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(currentRequest);
        chain.doFilter(wrappedRequest, servletResponse);
    }

之后,您可以使用拦截器中ContentCachingRepestWrapper的getContentAsByteArray方法获取byte[]内容。

 类似资料:
  • 问题内容: 我想将日志记录添加到Servlet中,因此我创建了Filter,该过滤器应显示请求并转到Servlet。但不幸的是,我遇到了例外: 因此,要解决此问题,我发现了Wrapper的解决方案,但它不起作用。我还能在代码中使用/更改什么?有任何想法吗? [MyHttpServletRequestWrapper] [MyFilter] 问题答案: 看起来restlet框架已经调用了Request

  • 问题内容: 我有以下指令: 这是我如何调用它: 首次初始化指令时,则为空。稍后,通过ajax对其进行检索,并填充其值。 问题是,我怎么看待更新的价值?当我从链接方法执行此操作时: 初始化指令时,仅调用一次,然后该值为空。通过ajax(来自)检索值时,不会再次调用此watch函数。但是,在我要显示的页面的其他部分,该值在获取ajax请求时会更新。因此,我认为问题与在ajax请求之后执行无关。 编辑:

  • 我有一个Jersey Web服务,需要解析与请求一起发送的一些json数据。 此服务生成以下异常: 我做了一些研究,表明不能在同一个请求上调用和。因此,似乎已经调用了一个实例。如果我没有给它打个明确的电话,这怎么可能呢?为了解决这个问题,我使用了方法 使用这种方法,我如何使用字节的int来获取json?

  • 问题内容: 问题 我正在使用内联函数定义设置反应 然后在DOM引用中未设置 我的理解是,回调应该在安装期间运行,但是在ref回调函数 之前* 调用添加语句揭示。 * 例如,我看过的其他代码示例在github上的讨论都表明相同的假设,应该在中定义的任何回调 之后调用,甚至在对话中也要说明 那么在所有的ref回调都执行完之后,componentDidMount是否被触发? 是。 我正在使用反应 15.

  • React引入了新的静态方法,它在每个呈现方法之前都会被调用,但为什么呢?在prop change之后调用它对我来说是有意义的,但是在之后调用它就没有意义了,也许我错过了什么。 我根据公司的要求创建了一个组件,在组件中日期是从道具控制的。我在组件中有以下状态。 是的,我在中创建了一个额外的变量来跟踪是否由于而被调用,但我认为这不是正确的方法。 或者是我做错了什么或者遗漏了什么,或者不应该在之后调用

  • 问题内容: 如果没有线程正在等待,使用,任何来电或没有任何效果。我有一种情况,如果在等待集为空时调用,则后续调用不应将线程置于等待状态。如何做到这一点?信号量可能是我能想到的一种解决方案。有没有更优雅的解决方案? 问题答案: 这种情况似乎非常适合。呼叫而不是和而不是等待。