getReader() is called by

来源:互联网 发布:seo外链工具有用吗? 编辑:程序博客网 时间:2024/06/06 11:40

filter中,当多次读取request流时,会报流已被读取的错:getReader() is called by ….
这是因为获取request流的方法是不容许被重复使用的,不同获取流的方法,一次请求中只能使用一次,getReader(),getInputStream(),所以,当我们需要在一次请求中使用同一种方法多次读取request流中的数据时,就需要对request进行封装,使其可以多次被我们读取使用,代码如下:

public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {    //使用        request = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);}
//request 转换类BodyReaderHttpServletRequestWrapperimport java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStreamReader;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {    private final byte[] body;    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {        super(request);        ServletInputStream stream = request.getInputStream();        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();        byte[] buff = new byte[100];        int rc = 0;        while ((rc = stream.read(buff, 0, 100)) > 0) {          swapStream.write(buff, 0, rc);        }        this.body = swapStream.toByteArray();    }    @Override    public BufferedReader getReader() throws IOException {        return new BufferedReader(new InputStreamReader(getInputStream()));    }    @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream bais = new ByteArrayInputStream(body);        return new ServletInputStream() {            @Override            public int read() throws IOException {                return bais.read();            }        };    }}
0 0
原创粉丝点击