【问题标题】:HTTP raw text POST request [duplicate]HTTP原始文本POST请求[重复]
【发布时间】:2018-03-11 00:05:54
【问题描述】:

我需要计算原始 HTTP 发布请求的哈希值,并将其与 Java 中相同标头中的签名哈希值进行比较。问题是,我尝试了多种方法,但无法提取发送的确切 POST 请求。附上请求:

我需要完全相同的字符串(以及所有 % 和其他符号),因为即使是单个空格差异也会生成不正确的哈希。我们可以在这里使用自定义过滤器吗,如果可以,那么究竟如何?

【问题讨论】:

标签: java http servlets


【解决方案1】:

您使用的是 servlet 还是 jersey?在 servlet 中,您可以获取请求的原始流并转换为字符串。 HttpServletRequest#getInputStream()getReader

例如

InputStream body = request.getInputStream();
// ..

编辑:添加我拥有的代码,这是可行的。

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        InputStream is = request.getInputStream();
        //this convertStreamToString is my internal method. You can have any your own conversion API
        System.out.println("----"+convertStreamToString(is)); 
        processRequest(request, response);
    }

【讨论】:

  • 警告:当您这样做时,您可能无法再使用getParameter(),因此您也必须自己处理内容。正如getParameter() 的javadoc 所说:如果参数数据是在请求正文中发送的,例如发生在HTTP POST 请求中,那么直接通过getInputStream()getReader() 读取正文可能会干扰执行这个方法。
  • 这是一个很好的观点。谢谢@Andreas。可以先获取 getParameters() 然后调用流/阅读器吗?我需要恢复到 API。
  • 我认为问题在于,如果内容是流式传输的(客户端决定),那么内容只能处理一次。 getInputStream()getReader()getParameter()(以及它的表亲)都使用内容。我认为,如果内容是完整发送的,即没有流式传输,它们都会起作用,因此 javadoc 中的“可以干扰”。流式传输是指内容被分块,即content-length 标头未给出。
  • getReader() 和 getInputStream() 没有帮助。他们返回空值。但是,我在 getParamterMap() 中获取值,但 htis 返回一个 map,但我的问题是我需要完全相同的原始数据而无需任何更改。
  • 在调用任何参数之前调用它。就像@Andreas 指出的那样,一旦您调用 getparameter(),流可能已经被读取并重置。
猜你喜欢
  • 2021-10-01
  • 2023-03-22
  • 2016-07-07
  • 2011-11-30
  • 2021-12-23
  • 2012-10-26
  • 1970-01-01
  • 2019-03-09
  • 2015-09-06
相关资源
最近更新 更多