【问题标题】:POST request not getting forwarded from Filter to Controller classPOST 请求未从过滤器转发到控制器类
【发布时间】:2020-03-09 11:24:50
【问题描述】:

从邮递员那里,我收到了一个类似http://localhost:8084/abc/api/v1/xyz 的帖子请求,其中包含有效负载和标头。我们已经配置了一个 Filter 类扩展 GenericFilterBean 在它到达控制器之前。它很好地执行了过滤器类的所有代码,但是在最后执行'chain.doFilter(request, response);' 以将请求转发到控制器方法时,它抛出了异常。在过滤器类中,我们正在读取有效负载并保存在审计表中。在Controller类方法中,我们有@RequestBody注解、@Context HttpServletRequest、BindingResult等参数。

18:59:25,779 INFO [stdout](默认任务 1)18:59:25,778||WARN |AbstractHandlerExceptionResolver:197|已解决 [org.springframework.http.converter.HttpMessageNotReadableException:读取输入时出现 I/O 错误信息;嵌套异常是 java.io.IOException: UT010029: Stream is closed]

请就此提出建议。

【问题讨论】:

  • 嘿,如果您使用的是 Spring Boot,请打开 Debug 日志记录并注意 [Source : PushBackInputStream] 它会给出您遇到错误的清晰信息

标签: spring spring-mvc servlet-filters


【解决方案1】:

您的过滤器是否在读取请求的内容?如果是这样,那么您将需要寻找替代方案,因为如果没有一些帮助,输入流不太可能是可重用的。

你能发布一些过滤方法的代码吗?


Spring 至少提供了一种机制来解决这个问题,这在这里可能会有所帮助,特别是 ContentCachingRequestWrapper。您可以创建一个新的Filter,将实际请求包装在此包装器中,也可以简单地在过滤器中自己使用它。

你可以用这样的东西更新你的过滤器

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
   HttpServletRequest currentRequest = (HttpServletRequest) servletRequest;
   ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(currentRequest);

   // todo: your magic code, using wrappedRequest to access the body of the request

   // note: passing through the wrapped request,
   // which allows later handlers to also access the request
   chain.doFilter(wrappedRequest, servletResponse);
}

注意documentation 对应ContentCachingRequestWrapper 注释

HttpServletRequest 包装器缓存从输入流和阅读器读取的所有内容,并允许通过字节数组检索此内容。

您收到的错误表明您正在读取请求的InputStream,而您应该简单地访问包装器的getContentAsByteArray 方法。

【讨论】:

  • 是的,它读取请求附带的标头和有效负载值。
  • 即使在使用 'ContentCachingRequestWrapper' 之后,也会出现同样的错误
  • 我们是否还必须在控制器方法中使用这个 Wrapper 类来代替 HttpservletRequest?
  • 读取请求内容时,是通过访问servletRequest还是wrappedRequest?
  • 我已更新答案以突出显示您可能出错的地方
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多