我正在使用 Spring 将请求的 JSON POST 数据映射到一个对象中@RequestBody
注释和MappingJacksonHttpMessageConverter
。但之后我想读取数据String
表单进行一些额外的身份验证。但是当编组发生时,InputStream
in HttpServletRequest
是空的。一旦我删除@RequestBody
将 POST 数据读入方法的参数String
按预期工作。
我是否必须通过放弃来妥协@RequestBody
并以某种方式手动进行绑定还是有更优雅的解决方案?
因此,基本上您需要计算请求正文的哈希值。优雅的方法是将装饰器应用到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();
...
}
其中 hash 是在 overriden 中增量计算的read
的方法HashingInputStreamDecorator
.
您还可以使用@RequestBody
如果你创建一个Filter
应用装饰器。在这种情况下,装饰器可以将计算出的哈希值作为请求属性传递给处理程序方法。但是,您需要仔细映射此过滤器,以仅将其应用于对特定处理程序方法的请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)