Есть ли способ вызвать метод getReader()
для HttpRequest
, а затем «сбросить» запрос, чтобы другие вызовы getReader()
не вызывали java.lang.IllegalStateException
?
сброс HttpRequest после вызова request.getReader()
Ответы (2)
Простой ответ: «Нет».
Поток нельзя сбросить, и нет метода API, который позволил бы вам снова открыть его. (И не без оснований. Инфраструктуре сервлета потребуется сохранить копию входных данных на всякий случай, если сервлет решит повторно открыть поток. Это было бы неоправданными накладными расходами.)
Если вы хотите сделать что-то подобное, вам нужно будет написать свой код, чтобы сохранить собственную копию данных. Если вы реализуете это в фильтре (или клапане Tomcat), вы можете создать HttpServletRequestWrapper
, чтобы скрыть тот факт, что вы уже прочитали данные .... как это было предложено @Vineet.
Как говорили другие люди, нет, я не думаю, что есть способ сбросить запрос.
Я был в той же ситуации, когда хотел записать содержимое запроса в 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();
}
}