首页 > 解决方案 > 如何在 java 中修改 HttpServletRequest 正文?

问题描述

我想在请求正文到达 Http Servlet 并得到处理之前对其进行修改。请求正文的 JSON 有效负载如下所示,我想摆脱“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;
    }

非常感谢你的帮助!

标签: javahttpservletsrequestservlet-filters

解决方案


您无法更改请求,但可以包装它。有关详细信息,请参阅以下问题:为什么我们要包装 HttpServletRequest ?api 提供了一个 HttpServletRequestWrapper 但是我们从包装请求中获得了什么?

您需要在您的 servlet 前面放置一个servlet 过滤器以使包装工作。

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


推荐阅读