静态内容。 tomcat6和tomcat7行为的区别

时间:2011-01-21 22:52:07

标签: tomcat tomcat6 tomcat7

我很抱歉,如果我问了一些被问过1000次的东西,但我搜索了它并且没有找到任何东西:)

我有2个tomcat安装。 windows上的tomcat 6和linux机器上的tomcat 7。我有一个使用spring的项目,并且有一些静态内容,我希望能够在不通过Spring的情况下提供服务。

这是我的servlet配置:

<servlet-mapping>
  <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>/static/*</url-pattern>
</servlet-mapping>

我的静态文件位于WEB-INF文件夹旁边的“静态”文件夹中。

现在有趣的是,在tomcat7上,当我向http://myserver.com/myproject/static/css/main.css发出请求时,它会在/webapps/myproject/static/css/main.css中查找该文件,但在tomcat6上它会在/ webapps中查找它/myproject/css/main.css并产生一个错误,说明没有这样的文件。

我应该调整哪个配置以使两个服务器以相同的方式工作?

2 个答案:

答案 0 :(得分:2)

你实际上是在滥用Tomcat的默认servlet。缺省servlet不是由servlet API定义的,而是特定于servlet容器的。已知Tomcat的默认servlet有一个错误,当以这种方式滥用时,它能够公开/WEB-INF/META-INF的所有内容,从而为敏感信息敞开大门。这被报告为issue 50026,并已在Tomcat 6.0.30及更高版本中修复。

解决方案很简单:您根本不应在web.xml中明确映射默认servlet。如错误报告中所述,您必须改为使用this approach

答案 1 :(得分:0)

caseyBalusC链接的同一问题提供的另一个更简单的答案是指定欢迎文件列表并将最后一个欢迎文件映射到应用程序servlet的URL模式。在此配置中,默认servlet处理静态内容,而任何不匹配的URL都会进入应用程序。

The full answer, with code, from casey