前景提要
HDC调试需求开发(15万预算),能者速来!>>>
问题背景:
Servlet3.1新特性——非阻塞式IO,ServletInputStream抽象类多了几个方法isFinished()、isReady()、setReadListener(ReadListener listener)。这些在之前的Servlet3.0里是没有的。
Tomcat7.x是Servlet3.0,Tomcat8.x是Servlet3.1。
之前是基于Tomcat7.x开发的程序,有个功能是做了个Request包装类,过滤ajax提交内容。里面把Request的getInputStream()方法重新实现。
@Override
public ServletInputStream getInputStream() throws IOException {
if (bais == null) {
bais = new ByteArrayInputStream(body);
} else {
bais.reset();
}
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
};
}
由于在Tomcat7.x环境下实现的,所以ServletInputStream没有上面说的那几个方法。
工程编译打包好后发布到服务器是Tomcat8.x上,跑了许多天,居然没有报错。为什么?
大神们,我的问题就是,像这种情况,有没有隐患?或者Servlet3.1是否向下兼容Servlet3.0?我怎么也想不明白这样的兼容是怎么做的,抽象类都改了,实现类不改居然不报错。
而且更疑惑的是,我用的Spring4.3.5,看了里面ContentCachingRequestWrapper类用的ContentCachingInputStream居然也是没有实现Servlet3.1新增的那几个方法。还有DelegatingServletInputStream也是一样没实现。由此应该确定Spring4.3也是基于Servlet3.0的,没有实现Servlet3.1。
大神们,第二个问题,如标题,你们用Servlet3.1了吗?用了的话来讨论讨论,上面那几个方法有没有参考实现,给参考参考。