request只能读取一次
之前我在拦截器中获取request里面的参数值,处理完之后回到控制器发现取不出来了,原因很简单:因为是流。想想看,java中的流也是只能读一次,因为读完之后,position就到末尾了。
办法
一、需要一个类继承HttpServletRequestWrapper,该类继承了ServletRequestWrapper并实现了HttpServletRequest,
因此它可作为request在FilterChain中传递。
该类需要重写getReader和getInputStream两个方法,并在返回时将读出的body数据重新写入。
二、需要一个Filter筛选目标urlPattern,调用第一个类的同时,将第一个类写入FilterChain中代替原本的Request。
package com.bonc.util;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;public class BodyReaderRequestWrapper extends HttpServletRequestWrapper {private final String body;/**** @param request*/public BodyReaderRequestWrapper(HttpServletRequest request) throws IOException{super(request);StringBuilder sb = new StringBuilder();InputStream ins = request.getInputStream();BufferedReader isr = null;try{if(ins != null){isr = new BufferedReader(new InputStreamReader(ins));char[] charBuffer = new char[128];int readCount = 0;while((readCount = isr.read(charBuffer)) != -1){sb.append(charBuffer,0,readCount);}}else{sb.append("");}}catch (IOException e){throw e;}finally {if(isr != null) {isr.close();}}sb.toString();body = sb.toString();}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body.getBytes());ServletInputStream servletIns = new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return byteArrayIns.read();}};return servletIns;}
}
package com.bonc.bitwd.filter;import com.bonc.util.BodyReaderRequestWrapper;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class BodyReaderRequestFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)res;BodyReaderRequestWrapper requestWrapper = new BodyReaderRequestWrapper(request);if(requestWrapper == null){filterChain.doFilter(request,response);}else {filterChain.doFilter(requestWrapper,response);}}@Overridepublic void destroy() {}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!