在使用Jackson + Jersey发送JSON响应之前生成HMAC

时间:2015-11-07 20:59:27

标签: java json jersey jackson jax-rs

我正在与Jersey和Jackson构建REST API。我使用本教程(http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/)开始使用Jackson。

我想在发送之前签署回复。如何获取将生成的JSON字符串,以便我可以签名?

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public Response getTrackInJSON() {

    Track track = new Track();
    track.setTitle("Enter Sandman");
    track.setSinger("Metallica");

    String HMAC = HMAC("[secret]", [track.toJson]);

    return Response.status(201).entity(track).header("HMAC", HMAC).build();

}

我还想验证一个请求的签名:

@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
public Response createTrackInJSON(Track track) {

    String rawRequestBody = [how to get the raw request?];

    //get header
    //verify HMAC

    return Response.status(201).entity(result).build();

}

所以我的重要问题是如何获取将在对象发送之前生成的原始JSON字符串?

感谢您的回答

1 个答案:

答案 0 :(得分:0)

两者都可以通过绕过泽西岛的默认输入/输出数据绑定并直接使用杰克逊来完成。为此,您可以将输入声明为byte[]InputStream,并使用杰克逊的ObjectMapper.readValue(...)。对于输出,您将声明返回byte[](可能在Response内),并使用ObjectMapper.writeValueAsBytes(responsePojo)。或者,如果使用字符串更容易(我忘记了HMAC计算如何工作的详细信息),ObjectMapper.writeValueAsString(responsePojo)将序列化为String