`
weifly
  • 浏览: 238839 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jetty和ajaxanywhere有冲突

阅读更多

有同事反映jetty下部署的应用程序有问题,而这个应用部署在tomcat则没有问题,这个应用使用了ajaxanywhere,同组的人判断jetty和ajaxanywhere不兼容,到底那里出了问题呢?还要从源码看起。

 

org.ajaxanywhere.BufferResponseWrapper类包装了原始的HttpServletResponse,并重写了getWriter和getOutputStream方法:

    public PrintWriter getWriter() throws IOException {
        if (writerBuffer == null) {
            writerBuffer = new StringWriter();
            pw = new PrintWriter(writerBuffer);
        }
        return pw;
    }

    public ServletOutputStream getOutputStream() throws IOException {
        if (streamBuffer == null) {
            streamBuffer = new ByteArrayOutputStream();
            sos = new ServletOutputStream() {
                public void write(int b) throws IOException {
                    streamBuffer.write(b);
                }

                public void write(byte b[]) throws IOException {
                    streamBuffer.write(b);
                }

                public void write(byte b[], int off, int len) throws IOException {
                    streamBuffer.write(b, off, len);
                }
            };
        }
        return sos;
    }

 在tomcat下发现只调用了getWriter方法,而在jetty下则同时调用了getWriter和getOutputStream方法,为什么会有这种差别呢?

 

问题出在jetty中的一个类:org.eclipse.jetty.server.Dispatcher,这个类的forward方法有问题,和tomcat中的对应的方法逻辑不一样,jetty在处理完forward调用后,有以下的代码:

                if (baseRequest.getResponse().isWriting())
                {
                    try {response.getWriter().close();}
                    catch(IllegalStateException e) 
                    { 
                        response.getOutputStream().close(); 
                    }
                }
                else
                {
                    try {response.getOutputStream().close();}
                    catch(IllegalStateException e) 
                    { 
                        response.getWriter().close(); 
                    }
                }

 tomcat在处理完forward调用后,有以下的代码:

                try {
                    PrintWriter writer = response.getWriter();
                    writer.close();
                } catch (IllegalStateException e) {
                    try {
                        ServletOutputStream stream = response.getOutputStream();
                        stream.close();
                    } catch (IllegalStateException f) {
                        ;
                    } catch (IOException f) {
                        ;
                    }
                } catch (IOException e) {
                    ;
                }

 

tomcat中的逻辑是先关闭writer,如果出错了,再尝试关闭outputStream

jetty中的逻辑是,如果baseRequest中有writer,则先关闭writer,如果没有writer,则先关闭outputStream

而BufferResponseWrapper调用getWriter或getOutputStream并不会触发被包装的HttpServletResponse创建底层的writer或outputStream,所有jetty中永远都会先关闭outputStream,这就会调用BufferResponseWrapper中的getOutputStream方法了。

 

解决的办法是用Tomcat中相关的代码替换Jetty相关的代码

分享到:
评论

相关推荐

    websocket+tomcat+jetty+netty

    Tomcat、Jetty和Netty都是支持WebSocket的Java服务器平台,各有其优势和适用场景。理解这些技术可以帮助开发者选择最适合他们项目的解决方案,并且能够有效地利用WebSocket实现高效的实时通信功能。

    myeclipse中jetty和svn检出的插件

    在MyEclipse中集成Jetty和SVN检出的插件,可以极大地优化开发流程,使开发者能够便捷地进行项目部署和团队协作。 首先,让我们详细了解一下Jetty。Jetty是一个开源的Servlet容器,它支持最新的Servlet和JSP标准,...

    Java Eclipse ee集合jetty和配置

    Eclipse EE 集合 Jetty 和配置 Eclipse 是一个功能强大且流行的集成开发环境(Integrated Development Environment,IDE),提供了许多插件和工具来支持各种编程语言和技术。其中,Eclipse EE(Enterprise Edition...

    jetty各个版本下载

    相比Apache Tomcat或其他服务器,Jetty在轻量级特性、内存使用效率和响应速度上有优势。特别是对于嵌入式场景,Jetty的轻便性使其成为首选。然而,Tomcat在社区支持和插件丰富度上可能更强。 7. **Jetty的扩展性**...

    jetty相关的全部jar包

    jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....

    I-Jetty相关jar包

    I-Jetty是一款轻量级的Java Web服务器和Servlet容器,它允许开发者快速地开发和部署Web应用程序。在标题中提到的"I-Jetty相关jar包"指的是为了使I-Jetty能够正常运行,需要从官方或其他来源获取并添加的一系列依赖库...

    maven集成jetty所需jar包maven-jetty-plugin,多版本

    - 使用旧版本的`maven-jetty-plugin`可能会导致某些新特性无法使用或与其他库冲突,因此保持插件更新是很重要的。 6. 结论: `maven-jetty-plugin`简化了Java Web应用的开发和测试过程,通过Maven的命令行即可...

    jetty-6.1.26.zip

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,与Tomcat相似,它为开发和...尽管现代开发可能更倾向于使用更新的版本,但对于了解Jetty的历史和原理,以及在某些场景下部署旧项目,这个版本仍有其价值。

    jetty所需jar包

    本篇文章将深入探讨Jetty所需jar包的相关知识点,帮助你理解和配置Jetty运行环境。 首先,让我们了解Jetty的核心组件和它们对应的jar包: 1. **jetty-server.jar**:这是Jetty服务器的基础,包含了处理HTTP连接和...

    jetty 9.4.9

    在Jetty 9.4.9中,我们发现有以下几个关键组件和功能: 1. **Servlet-API.jar**:这是Servlet规范的实现,提供了Servlet、Filter和Listener等核心接口,使得开发者可以编写处理HTTP请求的代码。Servlet API是Java ...

    jetty 8及依赖包

    这个压缩包包含Jetty 8版本的实现及其依赖库,是学习和理解Jetty工作原理,尤其是NIO(非阻塞I/O)和Servlet容器实现的宝贵资源。 Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理...

    jetty和eclpise集成jar包

    常见的插件有Jetty Integration for WTP (Web Tools Platform) 和 Jetty Maven Plugin。 5. **配置Jetty**:安装插件后,需要在Eclipse的项目设置中配置Jetty服务器。这包括选择Jetty版本、设置工作目录、映射Web...

    jetty-all.jar

    Jetty-all.jar是一个集合了众多Jetty组件的综合性JAR文件,它的主要目的是为了方便开发者在项目中快速引入和使用Jetty服务器。Jetty是一个开源的HTTP服务器和Servlet容器,它以其轻量级、高性能和易用性而受到广泛...

    jetty 适合jdk1.8用的服务器

    Jetty是一款开源、轻量级的Web服务器和Servlet容器,被广泛用于开发、测试和部署Java Web应用程序。相较于Apache Tomcat,Jetty以其简洁的架构、高性能和低内存占用而受到开发者青睐。在选择Jetty时,必须考虑到与...

    jetty在eclipse中配置

    如果出现错误,Eclipse的Console视图和Error Log视图会有相应的输出帮助调试。 7. **更新和部署** 当你修改了代码,Eclipse会自动检测变化并重新部署到Jetty,无需手动停止和启动服务器。你也可以通过右键点击...

    Jetty9 配置使用HTTPS证书

    综上所述,配置Jetty服务器使用HTTPS证书是一个涉及证书申请、格式转换和服务器配置的过程。正确配置HTTPS证书可以极大提高Web服务的安全性,保护传输数据不被第三方截获和篡改,是生产环境中保证通信安全的重要步骤...

    Jetty启动和JSP验证

    在Java Web开发中,Jetty作为一个小巧、高效的服务器,常被用于测试和部署应用程序,而JSP则是用于创建动态网页的后端技术。 首先,我们来详细了解Jetty的启动过程: 1. **安装Jetty**:首先需要下载Jetty的最新...

    jetty 学习资料合集

    这个学习资料合集应包含相关的文档、教程、示例代码、视频教程等,帮助初学者和有经验的开发者深入理解Jetty的各个方面,从而更好地利用Jetty构建和维护高效稳定的Web应用。"JettySample"可能是其中的一个示例项目,...

    eclipse_jetty9离线插件

    Eclipse Jetty 9离线插件是专为开发者设计的一款工具,旨在简化在Eclipse集成开发环境中配置和运行Jetty服务器的过程。Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,广泛用于开发、测试和部署Web应用...

Global site tag (gtag.js) - Google Analytics