Get RequestBody and ResponseBody at HandlerInterceptor

前端 未结 7 1754
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-14 11:31

Logic I have to implement is logging all requests with body served to DB.

So I decided to use: afterCompletion method of HandlerInterceptor

相关标签:
7条回答
  • 2020-12-14 12:30

    As others said, you can not read request input stream or response output stream more than once, but, you can use Filters to replace the original request and response objects with wrapped ones. This way you can implement your wrapper and bufferize the payload, this way you can use it how many times you want.

    Here a repo with the working code: https://github.com/glaudiston/spring-boot-rest-payload-logging

    Just do a mvn clean install on it and be happy.

    $ 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!"}
    
    0 讨论(0)
提交回复
热议问题