我正在尝试访问 Java Servlet 过滤器中的两个 http 请求参数,这里没有什么新东西,但惊讶地发现这些参数已经被使用了!因此,它们不再在过滤器链中可用。
似乎这只发生在参数进入 POST 请求正文(例如表单提交)时。
有没有办法读取参数而不消耗它们?
到目前为止,我只找到了这个参考: Servlet Filter using request.getParameter lost Form data 。
谢谢!
原文由 amuniz 发布,翻译遵循 CC BY-SA 4.0 许可协议
顺便说一句,解决这个问题的另一种方法是不使用过滤器链,而是构建自己的拦截器组件,也许使用方面,它可以对解析的请求体进行操作。它也可能更有效,因为您只需将请求
InputStream
转换为您自己的模型对象一次。但是,我仍然认为希望多次读取请求正文是合理的,特别是当请求通过过滤器链时。我通常会将过滤器链用于我想保留在 HTTP 层的某些操作,与服务组件分离。
正如 Will Hartung 所建议的,我通过扩展
HttpServletRequestWrapper
来实现这一点,使用请求InputStream
并基本上缓存字节。现在可以通过在将原始请求传递给过滤器链之前包装原始请求来多次读取请求正文:
该解决方案还允许您通过
getParameterXXX
方法多次读取请求正文,因为基础调用是getInputStream()
,这当然会读取缓存的请求InputStream
。编辑
对于
ServletInputStream
接口的较新版本。您需要提供更多方法的实现,例如isReady
、setReadListener
等。请参阅下面评论中提供的这个 问题。