簡體   English   中英

如何使用Jersey計算多部分請求正文的MD5哈希

[英]How to calculate MD5 hash of multipart request body using Jersey

我正在使用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哈希值。 當我的資源方法被調用時,來自HttpServletRequesthsr.getInputStream() )的輸入流已被消耗,我無法再次讀取它。

我嘗試將方法簽名更改為以下內容:

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

這樣,我可以獲取請求正文的原始字節,並且可以成功計算MD5哈希,但是我不知道如何從那里處理多部分請求(拆分部分,獲取每個部分等)。 我必須自己處理原始請求嗎? 或者我可以讓Jersey做些臟工作並為我提取FormDataParam ,然后讓我以某種方式計算MD5哈希值嗎?

謝謝,

這就是我最終要做的事情:

我創建了一個容器請求過濾器,該過濾器使用實體輸入流,計算MD5校驗和並再次設置實體輸入流,以便Jersey可以使用它來處理多部分請求並為我提取FormDataParam

我還將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) {
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM