当前位置: 首页 > 面试题库 >

修改HttpServletRequest正文

方博
2023-03-14
问题内容

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

问题:古老的应用程序发送了错误的HTTP
POST请求。参数之一不是URL编码。我知道这个参数总是排在最后,我知道它的名字。我现在正试图在运行在Tomcat中的服务器端修复它。

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

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

我可以以某种方式回避这个问题吗?可能有其他方法吗?

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


问题答案:

我发现的解决方案:

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

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

这4个组合将使您可以使用 getParameter 而不干扰 getInputStreamgetReader 方法。

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

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



 类似资料:
  • 我想在请求正文到达Http Servlet并获得processed.The请求正文的JSON有效负载如下所示,我想摆脱“PayamtChqmanViewObject”(详细信息)部分。 我可以使用以下方法获得请求正文,但我不知道如何删除JSON的详细部分并将处理后的请求正文传递给HTTP Servlet。 非常感谢您的帮助!

  • 我有一个通过数组工作的代码,实际上我希望传入ArrayList。 下面是示例: 这是我现在的改编... 我不明白我的错误??我不知道正确的语法... 有关信息,这里的代码 大体上 非常感谢你的帮助。

  • 说明 支付宝境外到店支付-修改商户二维码 官方文档:https://global.alipay.com/service/merchant_QR_Code/34 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\ModifyMerchantQR\Request 属性 名称 类型 说明 $service string 接口名称 $qrcod

  • 请求地址 https://api.es.xiaojukeji.com/river/Approval/update 返回数据格式 JSON 请求类型 POST 请求参数 参数名称 数据类型 必选 说明 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access token timestamp string yes 当前

  • 请求地址 https://api.es.xiaojukeji.com/river/Member/edit 返回数据格式 JSON 请求方式 POST 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access t

  • 请求地址 https://api.es.xiaojukeji.com/river/BudgetCenter/edit 返回数据格式 JSON 请求方式 POST 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的ac