Spring:如何在读取inputStream后使用@RequestBody

时间:2012-08-06 15:53:27

标签: java spring http rest inputstream

我遇到的问题是here,但我不清楚如何解决这个问题。

问题是我有一个AuthenticationProvider,它必须读取请求的主体。但是,当我的控制器方法想通过@RequestMapping使用该数据时,它是空的,因为Provider已经读取了inputStream。

有没有办法从Request获取一个支持mark / reset的inputReader,这样我的提供者可以在进行身份验证后简单地将流回滚到它的初始状态?看起来很疯狂,过滤器的默认行为是对请求对象的破坏性修改。

1 个答案:

答案 0 :(得分:3)

只有在特定情况下才应触发提供者,因此不应影响整个应用程序。但是,如果您需要提供者处理的请求中的正文,那么您仍然有一个解决方法:

  1. 实现servlet Filter
  2. 包装请求
  3. 在包装器中缓存请求主体,然后覆盖getInputStream()方法以返回带有缓存请求主体的ByteArrayInputStream。这样就可以多次阅读。
  4. spring的AbstractRequestLoggingFilter做了类似的事情并且有一个示例包装器,您可以检查它。