Java 多次访问请求流
我想使用getInputStream()从请求中获取请求体。我制作了一个Requestwrapper以便缓存请求,但它似乎不起作用,因为当我调用getInputStream()或getReader()时,流已关闭异常仍会出现。 我做错了什么 这是我的来电代码:Java 多次访问请求流,java,httprequest,Java,Httprequest,我想使用getInputStream()从请求中获取请求体。我制作了一个Requestwrapper以便缓存请求,但它似乎不起作用,因为当我调用getInputStream()或getReader()时,流已关闭异常仍会出现。 我做错了什么 这是我的来电代码: RequestWrapper request = new RequestWrapper(((ServletRequestAttributes) RequestContextHolder .currentRequestAttribute
RequestWrapper request = new RequestWrapper(((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes())
.getRequest());
InputStream obj = request.getInputStream(); //**java.io.IOException: Stream closed**
以下是应缓存请求的请求包装器类:
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
public class RequestWrapper extends HttpServletRequestWrapper {
private ByteArrayOutputStream cachedBytes;
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (cachedBytes == null) {
cacheInputStream();
}
System.out.println("cachednotnull");
return new CachedServletInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
private void cacheInputStream() throws IOException {
/* Cache the inputstream in order to read it multiple times. For
* convenience, I use apache.commons IOUtils
*/
cachedBytes = new ByteArrayOutputStream();
IOUtils.copy(super.getInputStream(), cachedBytes);
}
/* An inputstream which reads the cached request body */
public class CachedServletInputStream extends ServletInputStream {
private ByteArrayInputStream input;
public CachedServletInputStream() {
/* create a new input stream from the cached request body */
input = new ByteArrayInputStream(cachedBytes.toByteArray());
}
@Override
public boolean isFinished() {
return input.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
throw new RuntimeException("Not implemented");
}
@Override
public int read() throws IOException {
// TODO Auto-generated method stub
return input.read();
}
}
}
只有当处理请求的所有代码都使用相同的
RequestWrapper
实例时,这才有效。这意味着,如果在@Controller
方法中有一个@RequestBody
参数,即使Spring也应该使用它。这意味着你所做的事情应该在过滤器中完成。如果我猜对了,而你不是在过滤器中完成的,请参见例如@Andreas Thank alot,是的,这就是问题所在,在我的其他过滤器中使用它也可以解决它:)