赞
踩
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
server.port=8888
spring.redis.port=6379
spring.redis.host=localhost
@RestController
public class HelloController {
@PostMapping("/hello")
public String hello(@RequestBody String json) {
return json;
}
}
@Component
public class RepeatSubmitInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String s = request.getReader().readLine();
System.out.println("request.getReader().readLine()= " + s);
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
RepeatSubmitInterceptor repeatSubmitInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
}
}
采用一个装饰者模式,将请求重新包装一下
public class RepeatableReadRequestWrapper extends HttpServletRequestWrapper { private final byte[] bytes; public RepeatableReadRequestWrapper(HttpServletRequest request, HttpServletResponse response) throws IOException { super(request); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); bytes = request.getReader().readLine().getBytes(); } @Override public ServletInputStream getInputStream() throws IOException { ByteArrayInputStream bi = new ByteArrayInputStream(bytes); return 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 bi.read(); } @Override public int available() throws IOException { return bytes.length; } }; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } }
public class RepeatableRequestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (StringUtils.startsWithIgnoreCase(request.getContentType(),"application/json")){
RepeatableReadRequestWrapper requestWrapper = new RepeatableReadRequestWrapper(request, response);
filterChain.doFilter(requestWrapper,response);
return;
}
filterChain.doFilter(request,response);
}
}
@Bean
FilterRegistrationBean<RepeatableRequestFilter> repeatableRequestFilterFilterRegistrationBean(){
FilterRegistrationBean<RepeatableRequestFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new RepeatableRequestFilter());
bean.addUrlPatterns("/*");
return bean;
}
这样,就解决了请求参数为JSON时,采用IO流读取,只能请求一次的问题。
点击跳转源码仓库地址
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。