getReader() is called by
来源:互联网 发布:seo外链工具有用吗? 编辑:程序博客网 时间:2024/06/06 11:40
filter中,当多次读取request流时,会报流已被读取的错:getReader() is called by ….
这是因为获取request流的方法是不容许被重复使用的,不同获取流的方法,一次请求中只能使用一次,getReader(),getInputStream(),所以,当我们需要在一次请求中使用同一种方法多次读取request流中的数据时,就需要对request进行封装,使其可以多次被我们读取使用,代码如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //使用 request = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);}
//request 转换类BodyReaderHttpServletRequestWrapperimport java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStreamReader;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); ServletInputStream stream = request.getInputStream(); ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = stream.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } this.body = swapStream.toByteArray(); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } }; }}
0 0
- getReader() is called by
- getInputStream/getReader() has already been called for this request
- .sortEntities()is called this array is sorted by the entities.zIndex.
- requestLayout() improperly called by
- Which function is called?
- What is Called and When
- When is a destructor called?
- When is a destructor called?
- Why today is called present
- requestLayout() improperly called by android.widget.TextView
- 错误信息:setDataSource is called in state
- Why Schduler function is not called?
- Why is Linux called a monolithic kernel?
- Seed() in initializer is not called
- Amsterdam is called shopper's paradisepoker
- Application called By IE on Pseudo B/S Mode
- requestLayout() improperly called by 出现后的解决方法
- android W/View: requestLayout() improperly called by xxxView
- 关于android TV开发的若干心得
- 第八周 项目3:顺序串算法
- .DS_Store 文件是什么macOS
- 第八周项目3 逆序排列
- 第八周项目1-建立顺序串的算法库
- getReader() is called by
- Spring Bean Scope 有状态的Bean 无状态的Bean
- 第七周排队看病模拟(队列)
- python中的列表推导浅析
- 第8周项目5-计数的模式匹配
- 第八周项目2-建立链串的算法库
- 链表A+B
- [Err] 1292 - Truncated incorrect DOUBLE value: 'c5dbc300-6e56-4ef7-9644-78b1fbf47668'
- for循环与for...in循环JS