2015-11-07 87 views
0

我正在用Jersey和Jackson构建REST API。我使用本教程(http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/)开始使用Jackson。在与Jackson + Jersey发送JSON响应之前生成HMAC

我想在发送之前对响应进行签名。我怎样才能得到将生成的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字符串?

谢谢你的答案

回答

0

双方可以通过传递新泽西州的默认输入/输出数据绑定,并直接用杰克逊来完成。为此,您将声明输入为byte[]InputStream,并使用Jackson的ObjectMapper.readValue(...)。对于输出,您将声明返回byte[](可能在Response之内),并使用ObjectMapper.writeValueAsBytes(responsePojo)。或者,如果使用字符串更容易处理(我忘记了HMAC计算工作的细节),ObjectMapper.writeValueAsString(responsePojo)会给出序列号为String