如何签署 JSON 由 Spring Rest 控制器使用的消息?

How to sign JSON message used by Spring Rest controller?

我有一个 Spring REST 应用程序,它接受 JSON 消息,写成

 @RequestMapping(value = "/myhook", method = RequestMethod.POST, 
     produces = JSON, consumes = JSON)
  public @ResponseBody MyResponse doIt
     (@Valid @RequestBody(required = true) MyContractRequest request) {
      MyResponse response;
      ...
      return response;
  }

这在几乎没有代码支持的情况下工作得很好,但现在我需要签署响应和请求。

我从简单地计算 Java 级别的所有消息字段的共享签名并将其分配给专用签名字段开始。然而,这需要拥有并维护用于计算签名的代码:

   public void update(java.security.Signature sign) throws Exception {
    sign.update(name);
    sign.update(value);
    sign.update(etc);
  }

我周围的一些人表示,需要编写和维护此签名代码可能不是最佳设计,将整个消息签名为单个 JSON 字符串可能更好。我可以手动获取请求作为字符串,然后手动处理 JSON,但我真的很想保留 Spring 控制器概念。

此外,我不能再在消息本身中包含签名字段,因为该字段的值显然也会更改 JSON 字符串的签名。

是否有任何方法可以计算整个 JSON 消息 body 在消息发送和到达时的签名,以及将签名放在哪里以便与消息一起传递?其中一个想法是使用自定义 HTTP header 作为签名。无论如何,首先如何计算它?

您可以将 servlet 过滤器与 Spring MVC 一起使用,并在请求和响应中随意修改您的内容

示例:

http://www.mkyong.com/spring-mvc/how-to-register-a-servlet-filter-in-spring-mvc/

或者你可以使用 Spring 3 MVC 拦截器 http://viralpatel.net/blogs/spring-mvc-interceptor-example/