Есть ли способ вызвать метод getReader()
на HttpRequest
, а затем "reset" запрос, чтобы другие вызовы getReader()
не выбрасывали java.lang.IllegalStateException
?
Сброс HttpRequest после вызова request.getReader()
Ответ 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();
}
}