Tomcat在Spring MVC应用程序中提供静态资源服务

5

我正在构建一个Spring MVC应用程序,前端控制器servlet映射在“/”上拦截所有请求,我希望能够从tomcat而不是Spring来提供静态内容(.js、.css、.png等)。

我的应用程序结构如下:

-webapp/
   styles/
   images/
   WEB-INF/
          views/

默认情况下,因为frontController映射到我的应用程序的上下文根,它处理所有请求,但不提供任何静态资源。 静态资源的mvc配置如下。

<mvc:resources mapping="/resources/**" location="/"/>

页面的代码如下:

<img src="resources/images/logo.png" />

我需要配置Tomcat以无需Spring交互的方式提供静态资源。

有什么建议吗?

3个回答

7
您可以重新映射Tomcat的默认servlet(处理静态内容),例如:
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>

1

另一个可能的解决方案 - 只需将以下内容添加到您的Spring DispatcherServlet.xml中(Spring Docs

<mvc:default-servlet-handler/>

此标签允许将DispatcherServlet映射到“/”(从而覆盖容器默认Servlet的映射),同时仍然允许容器默认Servlet处理静态资源请求。它使用URL映射(给定最低优先级顺序)配置DefaultServletHttpRequestHandler为“/**”。此处理程序将转发所有请求到默认Servlet。
优点(与@nos解决方案相比):
  • URL重新映射解决方案根据您的容器而有所不同。Jetty / Tomcat 6将其视为'map URL / images / * to WEBAPP / images / '。Tomcat&lt; 6(以及其他可能)则认为这意味着'map URL / images / 到WEBAPP / *',这是一个重大安全漏洞。
  • 如果要从您的站点提供favicon.ico,robots.txt等,则必须为它们创建其他url映射。
缺点:
  • Spring在循环中,这绝对是不必要的。
此外,无论喜欢哪种解决方案,我建议将以下内容添加到您的web.xml中,以防止目录列表(例如URL / images)。
<servlet>
  <servlet-name>default</servlet-name>
  <init-param>
      <param-name>dirAllowed</param-name>
      <param-value>false</param-value>
  </init-param>
</servlet>

1

1
谢谢,我找到了解决方案,只需将静态资源扩展名映射到defaultServlet即可。 - Rigoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接