2

私はジャージーを使用しており、マルチパート ポスト リクエストの本文の 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させて s を抽出させ、MD5 ハッシュを何らかの方法で計算させることはできますか?

ありがとう、

4

1 に答える 1

0

これは私がやったことです:

エンティティ入力ストリームを消費し、MD5 チェックサムを計算し、エンティティ入力ストリームを再度設定するコンテナー リクエスト フィルターを作成しFormDataParamました。

HttpServletRequestまた、フィルターとリソース メソッドの両方に注入して、2 つの間でデータをやり取りしました。

これはフィルタ クラスです。

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;
    }

}

これは、セクションweb.xml内の私の関連セクションですservlet

<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) {
    // ...
}
于 2013-01-04T12:48:15.757 に答える