【问题标题】:How to modify HttpServletRequest body in java?如何在 java 中修改 HttpServletRequest 正文?
【发布时间】:2023-03-19 21:22:01
【问题描述】:

我想在请求正文到达 Http Servlet 并得到处理之前对其进行修改。请求正文的 JSON Payload 如下所示,我想去掉“PayamtChqmanViewObject”(详细信息)部分。

{
      "ChqAccCode": "1",
      "ChqAmt": 1,
      "ChqBankCompCode": "TEST",
      "ChqBchName": "TEST",
      "ChqBchPost": "Y",
      "ChqPostDate":"2020-08-14",
      "ChqCompCode": "TEST",
      "ChqDate": "2020-04-21",
      "ChqDeptCode": "0",
      "ChqDesc": "TEST",
      "ChqDraftCode": "M",
      "ChqJobCode": null,
      "ChqJointVenName": null,
      "ChqNum": 123,
      "ChqPayeeAddr1": "Rome",
      "ChqPayeeAddr2": "1",
      "ChqPayeeAddr3": "Rome",
      "ChqPayeeCountry": "Italy",
      "ChqPayeeName1": "A1",
      "ChqPayeeName2": null,
      "ChqPayeePostalCode": "85695",
      "ChqPayeeRegCode": "IT",
      "ChqRecCode": "O",
      "ChqSeqNum": "1",
      "ChqVenCode": "ZZ",
      "ChqVouCode": null,
      "PayamtChqmanViewObj":[
        {
          "PaCompCode": "ZZ",
          "PaChqCompCode": "ZZ",
          "PaVenCode": "ACME",
          "PaChqNum": 123,
          "PaPayCurrAmt": 1,
          "PaAmt": 1,
          "PaVouInvCode": "INV001",
          "PaDiscAmt": 0,
          "PaChqSeqNum": "1"
        }
   ]
}

我可以使用以下方法获取请求正文,但是我不确定如何删除 JSON 的详细信息部分并将处理后的请求正文传递给 HTTP Servlet。

 public static String getBody(HttpServletRequest request) throws IOException {

        String body = null;
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;

        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }

        body = stringBuilder.toString();
        System.out.println("BODY IS:" + body);
        return body;
    }

非常感谢您的帮助!

【问题讨论】:

  • 为什么要删除那部分?
  • 某个业务案例需要它。
  • @obayral - 你的方法完全错误。 Servlet 规范已经正是您想要完成的工作提供了一个强大的机制。请查看下面的Bogdan's 回复。如有问题请回帖;请务必“支持”和“接受”他的回复。
  • @paulsm4 你能告诉我为什么我的方法完全错误吗?我也接受了答案。

标签: java http servlets request servlet-filters


【解决方案1】:

您无法更改请求,但可以包装它。更多详情请参阅以下问题:Why do we wrap HttpServletRequest ? The api provides an HttpServletRequestWrapper but what do we gain from wrapping the request?

您需要在您的 servlet 前面放置一个 servlet filter 才能使包装工作。

至于如何从内容中删除该部分,您可以使用 String 类提供的普通旧字符串操作,或使用类似 StringUtils 的东西,或者您可以使用 parse the JSON 的库您的选择,删除该属性,然后将其作为字符串写回。

【讨论】:

  • 感谢您的回答!它让我有了更好的洞察力。不过,我确实有 2 个后续问题。 1) 我不能更改请求,但我不能将请求包装成我想要的形式吗? 2)我可以进行经典解析和字符串操作(这也是我的第一种方法),但是如何将此字符串传递给 HttpRequest 以由 Servlet 处理?谢谢。
  • 1) 这正是我在答案中所说的。在HttpServletRequestWrapper 的帮助下,您将原始请求包装到您自己的版本中。在您的版本中,您可以更改您想要的不同内容,并让其他所有内容都通过您包装的原始请求对象。 2)您可能需要在包装器中实现 getInputStream 方法以返回从您的 String 构造的 InputStream (也可能来自包装器的其他一些方法,具体取决于您还需要什么)。然后将包装器请求发送到链中的 servlet,而不是原始请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2015-09-08
  • 1970-01-01
  • 2019-01-20
  • 2019-07-31
  • 2013-02-17
  • 2022-06-10
相关资源
最近更新 更多