可以多次循环调用ServletRequest.getInputStream()吗?

时间:2018-12-03 21:35:29

标签: java servlets

遇到一些在servlet中执行此操作的代码:

while ((read = request.getInputStream().read(bytes)) != -1)
    buffer.write(bytes, 0, read);

虽然在大多数情况下,request.getInputStream()只是在某个地方返回一个字段,但我在想可能存在动态包装器或此类包装器可能进入不良状态。

文档中是否写有关于做这种事情的示例,我可以以此为例将getInputStream()代码从循环中拉出来?

1 个答案:

答案 0 :(得分:1)

可以多次调用getInputStream(),Servlet规范仅禁止将其与getReader()一起使用。根据{{​​3}}:

  

使用ServletInputStream将请求的主体作为二进制数据检索。可以调用此方法或getReader()来读取正文,而不能同时读取两者。

     

返回:

     

包含请求主体的ServletInputStream对象

     

投掷:

     
      
  • IllegalStateException-如果已为此请求调用getReader()方法
  •   
  • IOException-如果发生输入或输出异常
  •   

一种特定的Servlet实现可以自由返回一个包装器对象,但总有一天,人们总是希望ServletInputStream可以在某个时候抛出IOException(例如,连接重置)。

如果以Apache Tomcat为例,则HTTP连接处理逻辑在the ServletRequest#getInputStream() method javadoc中,并且非常具有防御性。 HTTP连接和基础套接字AbstractProtocol.ConnectionHandler.process() method的清理代码,因此应用程序错误不应干扰资源清理。