java - 如何使用 Jersey 计算多部分请求正文的 MD5 哈希值

标签 java jersey md5 multipartform-data

我正在使用 Jersey,我需要计算多部分发布请求正文的 MD5 哈希值。我当前的资源方法签名如下所示:

@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 做一些肮脏的工作并为我提取 FormDataParam 并让我以某种方式计算 MD5 哈希值吗?

谢谢,

最佳答案

这就是我最终做的:

我创建了一个使用实体输入流的容器请求过滤器,计算 MD5 校验和并再次设置实体输入流,以便 Jersey 使用它来处理多部分请求并提取 FormDataParam对我来说。

我还在我的过滤器和我的资源方法中注入(inject)了 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;
    }

}

这是 servlet 部分中我的 web.xml 的相关部分:

<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 - 如何使用 Jersey 计算多部分请求正文的 MD5 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039976/

相关文章:

java - 编译不同 Java 版本的 Jersey 库时出错

c# - 为什么 FileStream 和字符串的 MD5 哈希不同 C#

md5 - 哈希值(md5、sha1)的任何子字符串是否比另一个子字符串多 "random"?

php - 缺少密码检查

java - 日历时区,它是如何工作的?

java - 许多相同的按钮代码(简短的然后)

java - 使用 JAX-RS 中的 @QueryParam 和 @DefaultValue 时为 "Annotation type not applicable to this kind of declaration"

java - 整数不更新虽然方法应该强制它

java - 无法解析符号 NameValuePair

java - 在 Jersey webapp 启动时初始化数据库