Подтвердить что ты не робот

Сброс HttpRequest после вызова request.getReader()

Есть ли способ вызвать метод getReader() на HttpRequest, а затем "reset" запрос, чтобы другие вызовы getReader() не выбрасывали java.lang.IllegalStateException?

4b9b3361

Ответ 1

Простым ответом является "Нет".

Поток не сбрасывается, и нет метода API, который позволит вам его повторно открыть. (И по уважительной причине, это потребовало бы, чтобы инфраструктура сервлета сохраняла копию ввода только в том случае, если сервлет решил снова открыть поток. Это было бы неоправданным накладным расходами.)

Если вы хотите сделать это, вам нужно будет написать свой код, чтобы сохранить свою собственную копию данных. Если вы реализуете это в Filter (или Tomcat Valve), вы можете создать HttpServletRequestWrapper, чтобы скрыть тот факт, что вы уже прочитали данные... как это предлагает @Vineet.

Ответ 2

Как и другие люди сказали: "Нет, я не думаю, что есть способ reset запроса.

Я был в той же ситуации, когда вам нужно было регистрировать содержимое запроса в ServletFilter, прежде чем двигаться дальше. Вот сообщение форума, которое помогло мне разобраться, как создать 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();
    }
}