gpt4 book ai didi

java - 修改 HttpServletRequest 体

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:47 32 4
gpt4 key购买 nike

我正在处理遗留代码,需要打补丁。

问题:一个古老的应用程序发送错误的 HTTP POST 请求。其中一个参数未经过 URL 编码。我知道这个参数总是排在最后而且我知道它的名字。我现在正尝试在运行在 tomcat 中的服务器端修复它。

此参数无法通过 HttpServletRequest 的标准 getParameter 方法访问,因为它格式错误。方法只返回 null。但是当我通过 ServletInputStream 手动读取整个请求体时,所有其他参数都消失了。看起来底层类无法解析 ServletInputStream 的内容,因为它已被耗尽。

到目前为止,我已经设法制作了一个包装器,它从正文中读取所有参数并覆盖所有参数访问方法。但是,如果在我之前的链中的任何过滤器将尝试访问任何参数,则一切都会中断,因为 ServletInputStream 将为空。

我能以某种方式规避这个问题吗?可能有不同的方法吗?

总而言之,如果我在过滤器中读取原始请求正文,参数将从请求中消失。如果读取单个参数,ServletInputStream 将变为空,无法进行手动处理。此外,无法通过 getParameter 方法读取格式错误的参数。

最佳答案

我找到的解决方案:

仅仅重新定义参数访问方法是不够的。有几件事必须完成。

  1. 需要一个过滤器来包装请求。
  2. 需要自定义 HttpRequestWrapper 并覆盖所有参数访问方法。请求主体应在构造函数中解析并存储为字段。
  3. getInputStreamgetReader 方法也应该重新定义。它们的返回值取决于存储的请求正文。
  4. 自定义类扩展 ServletInputStream 是必需的,因为它是抽象的。

这 4 个组合将允许您使用 getParameter 而不会干扰 getInputStreamgetReader 方法。

请注意,对于多部分请求,手动请求参数解析可能会变得复杂。但这是另一个话题。

澄清一下,我重新定义了参数访问方法,因为我的请求已损坏,如问题中所述。你可能不需要那个。

关于java - 修改 HttpServletRequest 体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/681263/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com