Tomcat提供静态内容

时间:2010-09-29 14:23:55

标签: java spring tomcat servlets

我有一个Spring应用程序,我想知道提供静态内容的最佳方式。我尝试过以下方法:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

这是有效的,但DefaultServlet的行为意味着/static/PATH形式的任何请求都从webapp/PATH提供文件。这暴露了一个巨大的漏洞,允许使用以下URL显示敏感信息:http://localhost/app/static/META-INF/context.xml

这是什么常见的解决方案?我应该移动敏感文件吗?写我自己的DefaultServlet?或者有更好的方式来提供静态内容吗?

3 个答案:

答案 0 :(得分:15)

你测试过吗?根据Servlet规范,/META-INF/WEB-INF文件夹应该是公共的不可访问。客户应该为此获得404。否则它会成为DefaultServlet中的错误。

以下是Servlet 2.5 spec的摘录:

  

SRV.9.5目录结构

     

......还有,任何   客户端访问WEB-INF/目录中的资源的请求必须是   通过SC_NOT_FOUND(404)回复返回。

  

SRV.9.6 Web应用程序存档文件

     

...此外,任何访问请求   必须使用META-INF返回SC_NOT_FOUND(404)目录中的资源   响应。


更新:好的,我接受了我的话。我可以在最新的Tomcat 6和7上重现这一点。这绝对是DefaultServlet中的一个错误。它在Glassfish 3.0.1上工作正常(返回404)。


更新2:我已经向To​​mcat人员报告issue 50026


更新3:其中一位Tomcat的回应为:

  

我认为这是WONTFIX

     

servlet引擎保护Web中的WEB-INFMETA-INF路径   应用程序(工作正常),而不是任意的该名称的文件   路径。

     

这里实际发生的是您正在配置通用文件   提供servlet以在不同的路径下安装整个Web应用程序    - 它相当于配置Apache来做同样的事情。除了那个   DefaultServlet不是通用文件服务器 - 它被设计为映射   到/,您不能将其配置为执行任何操作,而是将文件提供给Web   应用程序目录。

     

我猜你正试图解决映射引入的问题   另一个到/*的servlet,它基本上是试图以a的方式工作   servlet引擎工作。   的 How to access static resources when mapping a global front controller servlet on /*   有一个更好的方法来处理事情的例子,如果这是你正在尝试   做。

     

在Tomcat中重新安装DefaultServlet的建议似乎已经存在了   Tomcat已经存在,所以也许我们需要锁定它(所以人们不能   意外地创建不安全的配置)或支持特定的安装   目录(在Web应用程序内部或外部),如果访问,则中断   在任何情况下映射到子路径时的根资源。


更新4:他们最终修复了它:

  

DefaultServlet和WebdavServlet的修复程序是针对7.0.x提交的(将在   7.0.4+)并建议用于6.0.x.   需要检查5.5.x并查看是否还需要反向端口。

答案 1 :(得分:11)

有几种更好的方式来提供静态内容。

传统方法是使用UrlRewriteFilter重新映射网址,如下所示:

web.xml

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
...
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

urlrewrite.xml

<urlrewrite default-match-type="wildcard">
    <rule>
        <from>/images/**</from>
        <to>/images/$1</to>
    </rule>
    <rule>
        <from>/scripts/**</from>
        <to>/scripts/$1</to>
    </rule>
    <rule>
        <from>/styles/**</from>
        <to>/styles/$1</to>
    </rule>
    <rule>
        <from>/**</from>
        <to>/app/$1</to>
    </rule>
</urlrewrite>

这种方法可以在大多数Spring样本中看到。

<小时/> Spring 3.0.1引入了更新的apporach - 它可以通过DispatcherServlet提供静态内容。它可以使用Spring的配置文件中的<mvc:resource>元素进行配置。在Spring 3.0.4中,它通过支持多个位置和缓存控制选项进行了扩展,请参阅15.12.4 mvc:resources

答案 2 :(得分:1)

WEB-INFMETA-INF是私人文件夹。客户端必须为此收到404错误。因为META_INF内容无法直接访问。否则请移动WEB_INF中的所有敏感文件。