我必须实现的逻辑是记录所有主体被提供给DB的请求。
所以我决定用途:HandlerInterceptor
的afterCompletion
方法。有两个参数传递给此方法HttpServletRequest
和HttpServletResponse
。
问题是:如何从提供的对象中获取RequestBody
和ResponseBody
?
据我所知,在Controller中我们可以使用@RequestBody
和@ResponseBody
。我可以在HandlerInterceptor
中重用它们吗?
8条答案
按热度按时间yftpprvb1#
您可以扩展
RequestBodyAdviceAdapter
并实现afterBodyRead
方法:RequestBodyAdvice在
HandlerInterceptor
之前的请求链中预先设置。它正好在http请求输入流转换为您的对象之后。kx7yvsdv2#
据我所知,
RequestBody
和ResponseBody
只能读一次。所以你不应该在Interceptor
中读它们。下面是一些explanation。41ik7eoe3#
正如其他人所说,你不能多次读取请求输入流或响应输出流,但是,你可以使用过滤器来替换原始的请求和响应对象,用这种方法你可以实现你的 Package 器和缓冲负载,这样你就可以使用它多少次。
下面是一个带有工作代码的repo:https://github.com/glaudiston/spring-boot-rest-payload-logging
只要在上面做一个
mvn clean install
,然后开心就行了。fiei3ece4#
下面是javadoc中针对HandlerInterceptor javadoc的相关语句。
请求处理完成后的回调,即呈现视图后。将在处理程序执行的任何结果上调用,从而允许正确的资源清理。
HandlerIntercepter Javadoc
无法访问请求正文(作为InputStream),因为请求已被读取。如果需要访问请求参数,可以使用请求对象通过调用- request.getParameter(“parameterName”)来实现;
无法访问响应正文,因为响应已呈现。这意味着响应已提交到输出流。
t9eec4r05#
您可以使用以下方法从HandlerInterceptorAdapter方法内部的HTTPServlet请求中获取请求主体:
如果要将其与扫描仪一起使用,可以按如下方式指定扫描仪:
然后你可以使用一些操作或扫描技巧来使用扫描器中的数据,或者你也可以使用Apache Commons IO将其赋给一个字符串:
u2nhd7ah6#
这是一个很老的线程,但为了人们谁寻找一种方法来获得
RequestBody
和ResponseBody
从拦截器。RequestBody
,可以简单地使用IOUtils:ResponseBody
,我不得不使用HttpServletResponseCopier:vd2z7a6w7#
您可以使用自Spring 4.1以来可用的
ResponseBodyAdvice
,使用它可以在响应主体被写入客户机之前截取响应主体。下面是一个例子:https://sdqali.in/blog/2016/06/08/filtering-responses-in-spring-mvc/
eh57zj3b8#
由于请求主体在拦截器中可用,而流在读取后不可用。如果您需要拦截器中的主体,然后在控制器中使用,则需要将其缓存在您自己的 Package 器中:https://tomsdevblog.com/read-message-body-in-request-interceptor/