Apache错误地将jsp页面转换为;“纯文本/纯文本”;
我有一个相当正常的设置,Apache通过AJP协议代理对Tomcat内部运行的servlet的请求 我们已经在Apache2.0.46/Tomcat 5.0.28上运行了这个安装程序很多年了,没有出现问题,但是最近更新到了Apache2.2.3/Tomcat 5.5 问题是,我们已经注意到,Apache会间歇性地(可能在3中有一次)将servlet提供的页面的“内容类型”HTTP头从“text/html”转换为“text/plain”,这导致浏览器显示html源代码,而不是呈现它 以前有没有人见过这种行为,知道原因是什么?我怀疑我们在servlet代码中做了一些不好的事情,而旧版本的Tomcat/Apache更能原谅这些错误Apache错误地将jsp页面转换为;“纯文本/纯文本”;,apache,tomcat,ajp,Apache,Tomcat,Ajp,我有一个相当正常的设置,Apache通过AJP协议代理对Tomcat内部运行的servlet的请求 我们已经在Apache2.0.46/Tomcat 5.0.28上运行了这个安装程序很多年了,没有出现问题,但是最近更新到了Apache2.2.3/Tomcat 5.5 问题是,我们已经注意到,Apache会间歇性地(可能在3中有一次)将servlet提供的页面的“内容类型”HTTP头从“text/html”转换为“text/plain”,这导致浏览器显示html源代码,而不是呈现它 以前有没有人见
更新:我已确认Apache正在更改标题。如果我直接浏览到Tomcat,问题就不会发生。如果您断断续续地看到这个问题,那么几乎可以肯定是servlet代码中的某些内容,而不是Tomcat或httpd的错误配置。您是否有可以打开以打印HTTP头内容的日志记录 为了进一步隔离问题,您还可以尝试绕过httpd,直接访问页面的Tomcat URL
我以前没有见过这种特殊的行为,所以很抱歉,我不能说得更具体。如果您间歇性地看到这个问题,几乎可以肯定这是servlet代码中的某些内容,而不是Tomcat或httpd的错误配置。您是否有可以打开以打印HTTP头内容的日志记录 为了进一步隔离问题,您还可以尝试绕过httpd,直接访问页面的Tomcat URL
我以前没有见过这种特殊的行为,所以很抱歉我不能说得更具体。间歇性,你的意思是有些页面表现出这种行为而其他页面没有,还是有些页面有时表现出这种行为而有时没有
您是否可以将任何日志附加到AJP层以记录该级别的HTTP头,以便验证是Apache还是Tomcat添加了虚假头?间歇性,您的意思是某些页面表现出这种行为而其他页面没有,还是有些页面有时表现出这种行为而有时没有
您能否将任何日志附加到AJP层以记录该级别的HTTP头,以便验证是Apache还是Tomcat添加了伪头?您是否要代理回集群?可能其中一台服务器配置错误。是否代理回群集?可能其中一台服务器配置错误。正常。我发现这是servlet代码中的一个bug: 我们是这样做的,以编写作为HTTP请求结果的序列化Java对象:
DeflaterOutputStream dos = new DeflaterOutputStream(response.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);
似乎发生的事情是,DeflaterOutputStream
和ObjectOutputStream
将在三到四个请求仍然附加到响应对象的输出流时被垃圾收集,这将导致流上发生混淆Apache并导致其重写标题
我将上述内容替换为:
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(byteStream);
oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);
oos.flush();
dos.finish();
byteStream.writeTo(response.getOutputStream());
问题已经解决了
以下链接似乎描述了类似的问题:
- 好的。我发现这是servlet代码中的一个bug:
我们是这样做的,以编写作为HTTP请求结果的序列化Java对象:
DeflaterOutputStream dos = new DeflaterOutputStream(response.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);
似乎发生的事情是,DeflaterOutputStream
和ObjectOutputStream
将在三到四个请求仍然附加到响应对象的输出流时被垃圾收集,这将导致流上发生混淆Apache并导致其重写标题
我将上述内容替换为:
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(byteStream);
oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);
oos.flush();
dos.finish();
byteStream.writeTo(response.getOutputStream());
问题已经解决了
以下链接似乎描述了类似的问题:
DefaultType None
从我的博客帖子:
一些Web应用程序没有正确设置它们所服务内容的mime类型,但在独立服务时仍然可以正常工作,因为浏览器等客户端应用程序能够解释内容的类型。但是,当在Apache后面提供服务时,这些应用程序将无法正常运行,因为Apache将提供默认类型的text/plain 解决方案是为以下web应用向apache虚拟主机添加DefaultType None行:
DefaultType None
从我的博客帖子:
我也面临着同样的问题,它得到了解决。 如果只有一个文件夹出现问题,那么有一个servlet正在阻止请求/响应,并向tomcat发出定制请求/响应。
Tomcat 7.0.x我也面临着它得到解决的同样问题。 如果只有一个文件夹出现问题,那么有一个servlet正在阻止请求/响应,并向tomcat发出定制请求/响应。
Tomcat 7.0.x该问题似乎会影响应用程序中的任何页面。该问题似乎会影响应用程序中的任何页面。我有一台服务器正确提供了该类型,但另一台服务器以纯文本形式提供。将这一行代码添加到有问题的服务器上的vhost对我来说很有效。我有一台服务器正确提供了该类型,但另一台服务器以纯文本形式提供。将此代码行添加到服务器上的vhost,问题已解决