我有一个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
/static/PATH
webapp/PATH
常见的解决方案是什么?我应该移动敏感文件吗?写我自己的DefaultServlet?还是有更好的方法来提供静态内容?
有几种更好的方式来提供静态内容。
传统方法 是使用UrlRewriteFilter来重新映射URL,如下所示:
UrlRewriteFilter
web.xml:
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.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。
DispatcherServlet
<mvc:resource>