【问题标题】:Spring: How to use @RequestBody after reading inputStreamSpring:阅读 inputStream 后如何使用@RequestBody
【发布时间】:2012-08-03 15:02:39
【问题描述】:

我遇到了here 描述的问题,但我不清楚如何解决。

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

有没有办法从支持标记/重置的 Request 获取 inputReader,以便我的提供者可以在进行身份验证后简单地将流回滚到其初始状态?过滤器的默认行为是对请求对象的破坏性修改,这似乎很疯狂。

【问题讨论】:

    标签: java spring http rest inputstream


    【解决方案1】:

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

    1. 实现一个servlet Filter
    2. 包装请求
    3. 在包装器中缓存请求体,然后重写getInputStream()方法返回一个ByteArrayInputStream和缓存的请求体。这样就可以多次读取。

    spring 的AbstractRequestLoggingFilter 做了类似的事情并且有一个示例包装器,你可以检查一下。

    【讨论】:

    • 听起来很可能;只是为了支持我的理解,“包装请求”意味着扩展 ServletRequest 并在我调用 chain.doFilter(request, response) 时将其传递。 Provider 确实只在特定情况下触发,但是当然,触发的情况是我需要 provider 中的 body 和 handler 方法的情况。无论如何,谢谢,我会在运行后立即接受答案。
    • 是的,HttpServletRequestWrapper 可以帮助您 - 您扩展它、实例化它、传递原始请求,它会委托所有方法,除了被覆盖的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多