5

我正在构建一个 Spring MVC 应用程序,frontController servlet 映射在“/”中,拦截所有请求,我能够从 tomcat 和不是春天。我的应用程序结构是

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

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

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

页面的代码是:

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

我需要配置 Tomcat 以提供静态资源而无需 spring 交互

有什么建议吗?

4

3 回答 3

7

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

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>
于 2010-09-18T23:52:15.207 回答
1

看看这个邮件列表线程,看看它是否符合您的要求。

于 2010-09-18T23:38:59.793 回答
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 < 6(可能还有其他)认为这意味着“将 URL/images/ 映射到 WEBAPP/*”,这是一个重大的安全漏洞。
  • 如果您想从您的站点提供 favicon.ico、robots.txt 等,那么您必须为它们创建额外的 url 映射。

缺点

  • 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>
于 2012-07-13T20:56:02.853 回答