很抱歉,如果我问的问题已经被问过 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 文件夹旁边的“static”文件夹中。
现在有趣的是,当我向 http://myserver.com/myproject/static/css/main.css 发出请求时,在 tomcat7 上它在/webapps/myproject/static/css/main.css 中查找文件,但在 tomcat6 上它在/webapps/myproject/css/main.css 中查找它并产生错误,指出没有这样的文件。
我应该调整什么配置才能让两台服务器以相同的方式工作?
最佳答案
您实际上是在滥用 Tomcat 的默认 servlet。默认 servlet 不是由 servlet API 定义的,而是特定于 servlet 容器的。已知 Tomcat 的默认 servlet 存在一个错误,当以这种方式被滥用时能够暴露 /WEB-INF
和 /META-INF
的所有内容,特此敞开大门到敏感信息。这被报告为 issue 50026并已在 Tomcat 6.0.30 及更高版本中得到修复。
解决方案很简单:您根本不应该在 web.xml
中显式映射默认 servlet。如错误报告中所述,您必须使用 this approach相反。
关于tomcat - 静态内容。 tomcat6 和 tomcat7 行为的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764675/