Tomcat, обслуживающий статические ресурсы в Spring приложении MVC

Я создаю приложение Spring MVC, а сервлет frontController отображается в "/", перехватывая все запросы, я должен был бы обслуживать статическое содержимое (.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 для обслуживания статических ресурсов без взаимодействия Spring.

Любое предложение?

Ответ 1

Вы можете переназначить сервлет tomcats по умолчанию (который обрабатывает статический контент), например.

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

Ответ 3

Другое потенциальное решение. Просто добавьте следующее в свой Spring DispatcherServlet.xml(Spring Docs)

<mvc:default-servlet-handler/>

Этот тег позволяет сопоставлять DispatcherServlet с "/" (таким образом, переопределяя отображение сервлетов по умолчанию в контейнере), но при этом разрешая статические запросы ресурсов обрабатывать Servlet по умолчанию для контейнера. Он настраивает DefaultServletHttpRequestHandler с сопоставлением URL (с учетом наименьшего порядка приоритета) "/**". Этот обработчик будет перенаправлять все запросы на Servlet по умолчанию.

Плюсы (по сравнению с решением @nos)

  • Решение переназначения URL-адресов ведет себя по-разному в зависимости от вашего контейнера. Jetty/Tomcat 6 считают, что это означает "URL карты/изображения/* для WEBAPP/images/". Tomcat < 6 (и, возможно, другие) считают, что это означает "URL-адрес карты/изображения/в WEBAPP/*", что является нарушением безопасности BIG.
  • Если вы хотите использовать 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>