一尘不染

Tomcat提供静态内容

tomcat

我有一个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?还是有更好的方法来提供静态内容?


阅读 221

收藏
2020-06-16

共1个答案

一尘不染

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

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

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引入 了一种新的方法
-它可以通过提供静态内容DispatcherServlet。可以使用<mvc:resource>Spring的配置文件中的element对其进行配置。在Spring
3.0.4中,它已扩展为支持多个位置和缓存控制选项,请参见15.12.4
mvc:resources

2020-06-16