2015-11-07 85 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