乡村门户网站建设,怎么做新网站的推广,阿里云医疗网站建设,长治seo顾问一般我们会在InterceptorAdapter拦截器中对请求进行验证 正常普通接口请求#xff0c;request.getParameter()可以获取#xff0c;能多次读取 如果我们的接口是用RequestBody来接受数据#xff0c;那么我们在拦截器中 需要读取request的输入流 #xff0c;因为 ServletReq… 一般我们会在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()));}
} View Code 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 requestWrappernull;if(request instanceof HttpServletRequest) {requestWrappernew BodyReaderHttpServletRequestWrapper((HttpServletRequest)request);}if(requestWrappernull) {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);}
} View Code 3、web.xm配置过滤器 !--定义过滤器--filter!--定义过滤器拦截URL地址--filter-nametest2/filter-name!--过滤器的文件--filter-classcom.zhhy.hy2000interface.utils.filter.MyFilter/filter-class/filterfilter-mapping!--过滤器的名称--filter-nametest2/filter-name!--过滤器负责拦截的URL--!-- /* 会把所有的请求拦截下来 --url-pattern/*/url-pattern/filter-mapping View Code 如果是Springboot使用注解即可