返回:如果对此ServletOutputStream的写入成功,则为true,否则返回false。
尽管Jetty的ServletOutputStream
实现,但当流处于CLOSED
状态时,HttpOutput
的行为似乎相当混乱。它返回true
case CLOSED:
return true;
资料来源:HttpOutput.java:1011.
此外,write
中的三种HttpOutput
方法都会在HttpOutput
为CLOSED
时抛出EofException
case CLOSED:
throw new EofException("Closed");
因此,写作似乎是不可能成功的。这种行为背后的原因是什么?
发布于 2018-06-29 13:29:41
关键事实:一个亲密的调用意味着一个写操作。
关闭的内部状态指示流/输出的使用与该调度关闭(而不是流本身实际上已关闭)。
我们是怎么进入这种状态的?某些东西触发了ServletOutputStream.close()
(然后又触发了HttpOutput.close()
),现在不再允许从当前调度对该流进行写入。
在关闭状态下,会发生刷新。
Transfer-Encoding
层(例如:块)。HttpOutput
也是所有嵌套请求的一个输出点,例如使用来自RequestDispatcher
的include()
,这将重新打开HttpOutput
以便在include()
期间使用,然后再次关闭它。
一旦完全和完全刷新/完成了HttpOutput
(不再有调度、不再写),那么最后的缓冲区刷新就完成了,传输编码就完成了,HttpOutput被重置、回收,并返回到HttpConnection以便与下一个交换一起使用。
我们可以在代码库中更好地使用javadoc‘,或者至少使用更有意义的常量和变量名。
开放https://github.com/eclipse/jetty.project/issues/2687
对于写的Jetty EofException
(而不是JVM EOFException
)。
一旦关闭了ServletOutputStream
以便在特定的调度中使用,对write()
的进一步调用将导致JettyEofException
。
还有一种EofException
风格,您提交的响应细节被违反了。
例:您声明响应Content-Length
为40 an,但是编写了41 an,超出了提交响应的能力,这是一个IOException。Servlet规范告诉我们在本例中抛出一个IOException
。
Jetty将抛出Jetty内部EofException
(它扩展了IOException),以指示此特定场景并中止连接,从而破坏您可能需要的任何连接持久性。
https://stackoverflow.com/questions/51101088
复制相似问题