江苏个人备案网站内容代理公司注册
一般我们会在InterceptorAdapter拦截器中对请求进行验证
正常普通接口请求,request.getParameter()可以获取,能多次读取
如果我们的接口是用@RequestBody来接受数据,那么我们在拦截器中
需要读取request的输入流 ,因为 ServletRequest中getReader()和getInputStream()只能调用一次
这样就会导致controller 无法拿到数据。
解决方法 :
1、自定义一个类 BodyReaderHttpServletRequestWrapper.java


import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader;import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper;import org.springframework.util.StreamUtils;/*** @author WBG* @date 2020/6/22 10:42* @describe*/ public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper{private byte[] requestBody = null;//用于将流保存下来public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);requestBody = StreamUtils.copyToByteArray(request.getInputStream());}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}@Overridepublic BufferedReader getReader() throws IOException{return new BufferedReader(new InputStreamReader(getInputStream()));} }
2、自定义 MyFilter 继承Filter


import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException;/*** @author WBG* @date 2020/6/22 14:32* @describe*/ public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("开始");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {ServletRequest requestWrapper=null;if(request instanceof HttpServletRequest) {requestWrapper=new BodyReaderHttpServletRequestWrapper((HttpServletRequest)request);}if(requestWrapper==null) {chain.doFilter(request, response);}else {System.out.println("------------------------------请求报文----------------------------------");System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper));System.out.println("------------------------------请求报文----------------------------------");chain.doFilter(requestWrapper, response);}}/* ** 获取请求体内容* @return* @throws IOException*/private String getParamsFromRequestBody(HttpServletRequest request) throws IOException {BufferedReader br = null;String listString = "";try {br = request.getReader();String str = "";while ((str = br.readLine()) != null) {listString += str;}} catch (IOException e) {e.printStackTrace();}return listString;}@Overridepublic void destroy() {System.out.println("destroy");} }
3、web.xm配置过滤器


<!--定义过滤器--><filter><!--定义过滤器拦截URL地址--><filter-name>test2</filter-name><!--过滤器的文件--><filter-class>com.zhhy.hy2000interface.utils.filter.MyFilter</filter-class></filter><filter-mapping><!--过滤器的名称--><filter-name>test2</filter-name><!--过滤器负责拦截的URL--><!-- /* 会把所有的请求拦截下来 --><url-pattern>/*</url-pattern></filter-mapping>
(如果是Springboot,使用注解即可)