当前位置: 首页 > 知识库问答 >
问题:

如何利用Jersey计算多部分请求体MD5哈希

吴胜涝
2023-03-14
@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String post(
        @FormDataParam("name") String name,
        @FormDataParam("description") String description,
        @FormDataParam("iconfile") FormDataBodyPart part,
        @Context HttpServletRequest hsr) {
    // ...
} 

我没有找到获取原始请求体的方法,我需要计算MD5散列。调用资源方法时,HttpServletRequest(HSR.GetInputStream())的输入流已经被使用,我无法再次读取它。

我尝试将方法签名更改为:

@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String test(byte[] bytes) {
    // ...
}

通过这种方式,我可以获得请求主体的原始字节,并且可以成功地计算MD5散列,但我不知道如何处理多部分请求(拆分部分,获取每个部分,等等)。我必须亲自处理原始请求吗?或者我可以让Jersey做这个肮脏的工作,为我提取FormDataParamS并让我以某种方式计算MD5哈希吗?

谢谢,

共有1个答案

微生运浩
2023-03-14

这就是我最后做的:

我创建了一个容器请求过滤器,它消耗实体输入流,计算MD5校验和,并再次设置实体输入流,以便Jersey可以消耗它来处理多部分请求,并为我提取FormDataParamS。

我还在筛选器和资源方法中都注入了HttpServletRequest,以便在两者之间通信数据。

public class MD5CheckFilter implements ContainerRequestFilter {

    @Context HttpServletRequest hsr;

    public ContainerRequest filter(ContainerRequest request) {

        byte[] bytes = request.getEntity(byte[].class); // this consumes the entity input stream
        String contentMD5 = calculateMD5(bytes);
        hsr.setAttribute("contentMD5", contentMD5);

        // set the entity input stream so it can be consumed again
        request.setEntityInputStream(new ByteArrayInputStream(bytes));

        return request;
    }

}
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>path.to.MD5CheckFilter</param-value>
</init-param>
@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String post(
        @FormDataParam("name") String name,
        @FormDataParam("description") String description,
        @FormDataParam("iconfile") FormDataBodyPart part,
        @Context HttpServletRequest hsr) {
    // ...
}
 类似资料:
  • 我试图用Java编写一个客户机来从RESTful web服务中获取数据。我已经看了几个教程和视频,但有一些我不明白。让我从这个开始。我能够使用PEST编写一个clientin PHP来获得成功的响应。这是一个如何发出请求的示例: 我发现有些事情很尴尬,我不太熟悉RESTful客户。出于某种原因,该站点使用POST请求而不是GET请求。凭据作为表单数据和任何查询参数在主体中传递。我查看的教程不是这样

  • 问题内容: 我想计算的不是字符串,而是整个数据结构的md5哈希。我了解执行此操作的方法的机制(调度值的类型,规范化字典键顺序和其他随机性,递归为子值等)。但这似乎是一种通常有用的操作,所以令我惊讶的是我需要自己动手操作。 Python中有一些更简单的方法来实现这一目标吗? 更新:建议使用酸洗,这是一个好主意,但是酸洗不能规范化字典的键顺序: 问题答案: bencode对字典进行排序,因此: 印刷品

  • 有多台笔记本电脑,手机,如何统合这些计算资源? 比如我在一台电脑上安装QQ这个软件 另一台电脑上不需要再安装这个软件 也可以使用QQ这个程序也就是说同样的资源是需要在一台电脑上即可 (我尝试过网络存储,但是效果不太好,首先太慢了,其次需要把每台电脑灯配置成服务器) 另外一个要求 对于一个计算任务把它分配给不同电脑上的CPU进行计算 顺便问一下企业是如何实现多个CPU资源充分利用

  • 我在我的项目中使用。所有POST数据都以格式发送,并在服务器端解编入各自的bean中。类似于这样: 向服务器发送请求: 我从这里得到了REST拦截器的实现。 我想访问拦截器中的有效载荷(请求体)。由于数据是JSON格式的,因此不能作为请求参数访问。是否有一种方法可以在拦截器方法中获得请求正文?请指教。

  • 我试图计算http post请求的请求体的内容长度,但我不断得到错误,表明内容长度错误。请求正文如下所示: 我尝试了两种解决方案,比如将正文的内容连接成一个字符串,比如following,然后将其转换成字节数组并发送其长度,但没有成功。 帖子请求正文是x-wow-form-urlencoded格式,内容长度必须正确计算。任何帮助都很感激,谢谢。

  • 我试图在PostMan中重新创建C#委托处理程序 我已经创建了计算auth头值的请求前脚本。 目前我的脚本是这样的: 这非常适合没有任何正文的GET请求。但是,当我发送请求时,由于C#和Postman中的正文哈希差异,我收到了未经授权的响应(401)。 我正在尝试访问完整的请求体,因为我需要计算出它的散列值。 我有C#的工作代码,而不是我想用Postman重新创建相同的请求。 我的问题是: 如何在