kyb*_*org 7 java spring spring-mvc
我必须实现的逻辑是将所有请求记录到提供给DB的正文.
所以我决定使用:afterCompletion
方法HandlerInterceptor
.有传递给此方法两个参数HttpServletRequest
和HttpServletResponse
其他人之间.
问题是:如何获取RequestBody
和ResponseBody
提供的对象?
据我所知,我们可以使用@RequestBody
和@ResponseBody
.我可以重复使用HandlerInterceptor
吗?
Muh*_*edy 11
您可以扩展RequestBodyAdviceAdapter
和实现该方法afterBodyRead
:
@ControllerAdvice
public MyRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter {
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
// write body -your input dto- to logs or database or whatever
return body;
}
}
Run Code Online (Sandbox Code Playgroud)
RequestBodyAdvice在之前预先设置请求链HandlerInterceptor
。正是在http请求输入流转换为您的对象之后。
正如其他人所说,您不能多次读取请求输入流或响应输出流,但是,您可以使用过滤器将原始请求和响应对象替换为包装的对象。通过这种方式,您可以实现包装器并缓冲有效负载,这样您就可以根据需要多次使用它。
这是一个带有工作代码的回购:https : //github.com/glaudiston/spring-boot-rest-payload-logging
做一个mvn clean install
就可以了,开心就好。
$ java -jar target/rest-service-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.2.RELEASE)
2020-01-24 13:06:07.297 INFO 918 --- [ main] c.e.restservice.RestServiceApplication : Starting RestServiceApplication v0.0.1-SNAPSHOT on ca275nt with PID 918 (/home/ggs/src/spring-boot-rest-payload-logging/target/rest-service-0.0.1-SNAPSHOT.jar started by ggs
in /home/ggs/src/spring-boot-rest-payload-logging)
2020-01-24 13:06:07.301 INFO 918 --- [ main] c.e.restservice.RestServiceApplication : No active profile set, falling back to default profiles: default
2020-01-24 13:06:08.331 INFO 918 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-01-24 13:06:08.348 INFO 918 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-01-24 13:06:08.348 INFO 918 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.29]
2020-01-24 13:06:08.410 INFO 918 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-01-24 13:06:08.410 INFO 918 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1044 ms
2020-01-24 13:06:08.627 INFO 918 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-01-24 13:06:08.787 INFO 918 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-01-24 13:06:08.791 INFO 918 --- [ main] c.e.restservice.RestServiceApplication : Started RestServiceApplication in 1.928 seconds (JVM running for 2.319)
2020-01-24 13:06:11.014 INFO 918 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-01-24 13:06:11.014 INFO 918 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-01-24 13:06:11.022 INFO 918 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2020-01-24 13:06:11 [] INFO RequestFilter:23 - doFilter, parsing request
2020-01-24 13:06:11 [] INFO LogApiInterceptor:64 - Request Method: POST
2020-01-24 13:06:11 [] INFO LogApiInterceptor:65 - Request Headers:
2020-01-24 13:06:11 [] INFO LogApiInterceptor:66 - host:localhost:8080
user-agent:curl/7.64.0
accept:*/*
content-length:32
content-type:application/x-www-form-urlencoded
2020-01-24 13:06:11 [] INFO LogApiInterceptor:67 - Request body:
2020-01-24 13:06:11 [] INFO LogApiInterceptor:68 - testdata=123456789&test2=9876543
2020-01-24 13:06:11 [] INFO LogApiInterceptor:75 - Response Status: 200
2020-01-24 13:06:11 [] INFO LogApiInterceptor:76 - Response Headers:
2020-01-24 13:06:11 [] INFO LogApiInterceptor:77 -
2020-01-24 13:06:11 [] INFO LogApiInterceptor:78 - Response body:
2020-01-24 13:06:11 [] INFO LogApiInterceptor:84 - {"id":1,"content":"Hello, World!"}
??????????????????????????????????????????????????????????????????????????????????????????????????????????????
$ curl -X POST --data "testdata=123456789&test2=9876543" http://localhost:8080/greeting
{"id":1,"content":"Hello, World!"}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38125 次 |
最近记录: |