Итак, в основном вам нужно вычислить хэш тела запроса. Элегантный способ сделать это - применить декоратор к InputStream
.
Например, внутри метода обработчика (в этом случае вы не можете использовать @RequestBody
и вам нужно создать HttpMessageConverter
вручную):
@RequestMapping(...)
public void handle(HttpServletRequest request) throws IOException {
final HashingInputStreamDecorator d =
new HashingInputStreamDecorator(request.getInputStream(), secretKey);
HttpServletRequest wrapper = new HttpServletRequestWrapper(request) {
@Override
public ServletInputStream getInputStream() throws IOException {
return d;
}
};
HttpMessageConverter conv = ...;
Foo requestBody = (Foo) conv.read(Foo.class, new ServletServerHttpRequest(wrapper));
String hash = d.getHash();
...
}
где хэш вычисляется постепенно в переопределенных read
методах HashingInputStreamDecorator
.
Вы также можете использовать @RequestBody
, если создаете Filter
для применения декоратора. В этом случае декоратор может передать вычисленный хэш методу обработчика как атрибут запроса. Однако вам необходимо тщательно сопоставить этот фильтр, чтобы применять его только к запросам к конкретному методу-обработчику.