在调用request.getReader()之后重置HttpRequest

|| 有没有办法在
HttpRequest
上调用
getReader()
方法,然后“重置”请求,以便其他对
getReader()
的调用不会抛出
java.lang.IllegalStateException
?     
已邀请:
        简单回答是不\”。 该流不可重置,并且没有API方法可让您重新打开它。 (并且有充分的理由。这需要servlet基础结构保留输入的副本,以防servlet决定重新打开流。这将是不必要的开销。) 如果您想做这种事情,则需要编写代码以保留其自己的数据副本。如果在过滤器(或Tomcat阀)中实现此功能,则可以创建一个ѭ4来隐藏事实,如@Vineet所建议的那样,您已经读取了数据。     

bab

        就像其他人说的,不,我认为没有办法重置请求。 我一直想在继续之前在ServletFilter中记录请求的内容。这是一个论坛帖子,可帮助我弄清楚如何创建Stephen C所谈论的
HttpServletRequestWrapper
。它将存储数据,因此您可以多次调用
getReader()
getInputStream()
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest original;
    private byte[] reqBytes;
    private boolean firstTime = true;

    public MyRequestWrapper(HttpServletRequest request) {
        super(request);
        original = request;
    }

    @Override
    public BufferedReader getReader() throws IOException{

        if(firstTime)
            firstTime();

        InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(reqBytes));
        return new BufferedReader(isr);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {

        if(firstTime)
            firstTime();

        ServletInputStream sis = new ServletInputStream() {
            private int i;

            @Override
            public int read() throws IOException {
                byte b;
                if(reqBytes.length > i)
                    b = reqBytes[i++];
                else
                    b = -1;

                return b;
            }
        };

        return sis;
    }

    private void firstTime() throws IOException{
        firstTime = false;
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = original.getReader();
        String line;
        while((line = reader.readLine()) != null){
            buffer.append(line);
        }
        reqBytes = buffer.toString().getBytes();
    }
}
    

要回复问题请先登录注册