In the previous chapter, we briefly introduced the source code demo of the interceptor. , there is no exception when getting get parameter in interceptor, but after reading body content in input stream in interceptor, @ RequestBody annotation parameter in controller cannot get content
The following describes the source code to solve this problem.
Test source
The directory structure of interceptor ﹣ demo2 of springboot project is as follows:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>interceptor_demo2</artifactId> <version>0.0.1-SNAPSHOT</version> <name>interceptor_demo2</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Configuration file application.properties, only configure the web server port
server.port=8090
Custom interceptor TestInterceptor
package com.example.interceptor_demo2.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class TestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("uri="+request.getRequestURI()); try { RequestWrapper requestWrapper = new RequestWrapper(request); String body = requestWrapper.getBody(); System.out.println("Interceptor gets body content:"+body); }catch (Exception e){ e.printStackTrace(); } return true; } }
Register interceptor WebConfigurer
package com.example.interceptor_demo2.interceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfigurer implements WebMvcConfigurer { @Autowired private TestInterceptor loginInterceptor; /** * This method is used to configure static resources, such as html, js, css, etc. * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } /** * This method is used to register interceptors. The interceptors written by ourselves need to be registered here to take effect. * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns("/ * *") means to intercept all requests. // excludePathPatterns("/login", "/register") means that in addition to login and registration, login registration does not need to be accessed. registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); } }
RequestWrapper
package com.example.interceptor_demo2.interceptor; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; public class RequestWrapper extends HttpServletRequestWrapper { private final String body; public RequestWrapper(HttpServletRequest request) { super(request); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; InputStream inputStream = null; try { inputStream = request.getInputStream(); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead = -1; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } else { stringBuilder.append(""); } } catch (IOException ex) { } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; } }
Filter ChannelFilter
package com.example.interceptor_demo2.interceptor; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @WebFilter(urlPatterns = "/*",filterName = "channelFilter") public class ChannelFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ServletRequest requestWrapper = null; if(servletRequest instanceof HttpServletRequest) { requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest); } if(requestWrapper == null) { System.out.println("servletRequest"); filterChain.doFilter(servletRequest, servletResponse); } else { System.out.println("requestWrapper"); filterChain.doFilter(requestWrapper, servletResponse); } } @Override public void destroy() { } }
Test class TestController
package com.example.interceptor_demo2.controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @RequestMapping("/test") public String test(@RequestBody String paramsJson){ System.out.println("paramsJson"+paramsJson); return "controller@RequestBody Get parameter content:" + paramsJson; } }
Start class InterceptorDemoApplication
package com.example.interceptor_demo2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication //Registered filter annotations @ServletComponentScan public class InterceptorDemo2Application { public static void main(String[] args) { SpringApplication.run(InterceptorDemo2Application.class, args); } }
test
Using postman test, send post request body as json content {"key": "123"}. If postman is not installed and there is no other test post request tool Click here to download
Source code
Links: https://pan.baidu.com/s/1knR0rWTR3c3dP7CDJjYG3A
Extraction code: 7x0j