Java 读取http请求而不丢失其中的数据
有没有办法读取请求的inputStream而不丢失其中的数据。Java 读取http请求而不丢失其中的数据,java,servlets,servlet-3.0,Java,Servlets,Servlet 3.0,有没有办法读取请求的inputStream而不丢失其中的数据。 在处理请求之前,我试图将请求的原始副本转换为字符串。但是,一旦我从请求中读取了inputstream,inputstream就会变为null,所以我以后无法从请求中获取参数。我尝试使用CustomHttpServletRequestWrapper,但没有成功。下面是我的代码片段 InboundHandler是我的处理程序类,它具有从我的servlet类调用的processRequest(HttpServletRequest请求,H
在处理请求之前,我试图将请求的原始副本转换为字符串。但是,一旦我从请求中读取了inputstream,inputstream就会变为null,所以我以后无法从请求中获取参数。我尝试使用
CustomHttpServletRequestWrapper
,但没有成功。下面是我的代码片段
InboundHandler
是我的处理程序类,它具有从我的servlet类调用的processRequest(HttpServletRequest请求,HttpServletResponse响应)
方法
public class InboundHandler {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
CustomHttpServletRequestWrapper requestWrapper = new CustomHttpServletRequestWrapper(request);
String body = getRequestBody(requestWrapper.getInputStream());
String from = request.getParameter("from"); //which I'm getting null here
// I also tried using
// String from = requestWrapper.getParameter("from"); // Even this did not work
} catch (Exception e) {
e.printStackTrace();
}
}
private String getRequestBody(InputStream inputStream) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) != -1) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
}
} catch (IOException ex) {
ex.printStackTrace();
//throw new AuthenticationException("Error reading the request payload", ex);
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException iox) {
// ignore
}
}
}
return stringBuilder.toString();
}
public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String body;
public CustomHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
ex.printStackTrace();
//log.error("Error reading the request body...");
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
ex.printStackTrace();
//log("Error closing bufferedReader...");
}
}
}
body = stringBuilder.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream inputStream = new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return inputStream;
}
}
}
问:有没有办法读取请求的inputStream而不丢失其中的数据 答:是的,只需“保存”你“阅读”的内容 正如佩多莫夫正确地说的,“请求并不意味着被重用”。一旦你给花园浇水,你就不能把水放回水管里:) 您可以保存数据。Perdomoff建议使用会话变量 另一种选择可能是使用。以下是一个很好的教程: