问题背景:
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了吗?用了的话来讨论讨论,上面那几个方法有没有参考实现,给参考参考。
3.1肯定是兼容3.0的,这个毋庸置疑。当然,理论上哪怕完全兼容,现实中因为具体实现的差异,也可能会造成问题,但是这是一个概率问题,不是必然问题。
是否有隐患,只能靠日常监控和测试来查。我的建议是如果你怕有问题,可以尝试基于3.1的规则进行修改,去掉你们原来的魔改部分,用3.1规范重写。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。