Tomcat在Spring MVC应用程序上提供静态资源

时间:2010-09-18 23:29:50

标签: spring tomcat static-resource

我正在构建一个Spring MVC应用程序,并且frontController servlet映射在“/”中拦截所有请求,我将能够提供静态内容(.js,.css,.png ...)从tomcat而不是Spring。 我的应用结构是

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

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

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

页面的代码是:

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

我需要配置Tomcat以提供静态资源而不进行弹簧交互

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

您可以重新映射tomcats默认servlet(处理静态内容),例如

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>

答案 1 :(得分:1)

查看this mailing list thread,看看是否符合您的要求。

答案 2 :(得分:1)

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

<mvc:default-servlet-handler/>
  

此标记允许将DispatcherServlet映射到“/”(从而覆盖容器的默认Servlet的映射),同时仍允许容器的默认Servlet处理静态资源请求。它使用URL映射(给定最低优先级顺序)“/ **”配置DefaultServletHttpRequestHandler。此处理程序将所有请求转发到默认Servlet。

优点(与@nos的解决方案相比)

  • 根据您的容器,URL重映射解决方案的行为会有所不同。 Jetty / Tomcat 6将其视为“将URL / images / *映射到WEBAPP / images / ”。 Tomcat&lt; 6(也许是其他人)认为“将URL / images / 映射到WEBAPP / *”,这是一个很大的安全漏洞。
  • 如果你想从你的网站上提供favicon.ico,robots.txt等,那么你就可以了 为他们创建额外的url-mappings。

缺点

  • Spring处于循环中,这绝对是不必要的。

此外,无论人们喜欢哪种解决方案,我都建议在web.xml中添加以下内容以防止目录列表(在URL /图像上)

<servlet>
  <servlet-name>default</servlet-name>
  <init-param>
      <param-name>dirAllowed</param-name>
      <param-value>false</param-value>
  </init-param>
</servlet>