我有一个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?或者有更好的方式来提供静态内容吗?
答案 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:我已经向Tomcat人员报告issue 50026。
更新3:其中一位Tomcat的回应为:
我认为这是
WONTFIX
。servlet引擎保护Web中的
WEB-INF
和META-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-INF
和META-INF
是私人文件夹。客户端必须为此收到404错误。因为META_INF
内容无法直接访问。否则请移动WEB_INF
中的所有敏感文件。