Как получить доступ к статическим ресурсам при отображении сервлета глобального фронт-контроллера в / * - PullRequest
57 голосов
/ 15 мая 2009

Я отобразил диспетчер Spring MVC как сервлет глобального фронт-контроллера на /*.

<servlet>       
  <servlet-name>home</servlet-name>         
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
</servlet>  
<servlet-mapping>       
  <servlet-name>home</servlet-name>         
  <url-pattern>/*</url-pattern>     
</servlet-mapping>

Однако это сопоставление останавливает доступ к статическим файлам, таким как CSS, JS, изображения и т. Д., Которые находятся в папке /res/.

Как я могу получить к ним доступ в любом случае?

Ответы [ 18 ]

1 голос
/ 10 февраля 2014

Я обнаружил, что с помощью

<mvc:default-servlet-handler />

в файле определения bean-компонента сервлета MVC у меня работает. Он передает любой запрос, который не обрабатывается зарегистрированным контроллером MVC, на оригинальный обработчик контейнера по умолчанию, который должен служить ему в качестве статического содержимого. Просто убедитесь, что у вас нет зарегистрированного контроллера, который обрабатывает все, и он должен работать просто отлично. Не уверен, почему @logixplayer предлагает переписать URL; Вы можете добиться того эффекта, который он ищет, просто адекватно используя Spring MVC.

1 голос
/ 20 декабря 2011

Безуспешно попробовав подход фильтра (по какой-то причине он не вошел в функцию doFilter ()), я немного изменил настройки и нашел очень простое решение для проблемы обслуживания корня:

Вместо подачи "/ *" в моем главном сервлете я теперь слушаю только специальные языковые префиксы "EN", "EN / *", "DE", "DE / *"

Статический контент обслуживается сервлетом по умолчанию, а пустые корневые запросы отправляются в index.jsp, который вызывает мой основной сервлет с языком по умолчанию:

(нет другого содержимого на странице индекса.)

1 голос
/ 29 августа 2010

Добавьте папки, которые вы не хотите запускать в обработку сервлета, в раздел <static-files> вашего файла appengine-web.xml.

Я только что сделал это и похоже, что все начинает работать нормально. Вот моя структура:

/

/ pages / <. Jsp файлы>

/ CSS

Я добавил "/ pages / **" и "/ css / **" в раздел <static-files>, и теперь я могу пересылать файл .jsp из сервлета doGet без создания бесконечного цикла.

0 голосов
/ 15 декабря 2015

В Embedded Jetty мне удалось добиться чего-то похожего, добавив отображение для каталога "css" в web.xml. Явное указание использовать DefaultServlet:

<servlet>
  <servlet-name>DefaultServlet</servlet-name>
  <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>DefaultServlet</servlet-name>
  <url-pattern>/css/*</url-pattern>
</servlet-mapping>
0 голосов
/ 09 августа 2014

Я нашел более простое решение с фиктивным индексным файлом.

Создайте сервлет (или используйте тот, который вы хотите ответить на "/"), который соответствует "/index.html" (Решения, упомянутые здесь, используют отображение через XML, я использовал версию 3.0 с аннотацией @WebServlet) Затем создайте статический (пустой) файл в корне статического содержимого с именем «index.html»

Я использовал Jetty, и произошло то, что сервер распознал файл вместо того, чтобы перечислить каталог, но когда его спросили о ресурсе, мой сервлет взял на себя управление. Все остальные статические материалы остались без изменений.

0 голосов
/ 31 декабря 2015
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
</beans>

и если вы хотите использовать конфигурацию на основе аннотаций, используйте код ниже

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
0 голосов
/ 11 апреля 2019

Что касается Tomcat, многое зависит от конкретной версии. Было исправление ошибки https://bz.apache.org/bugzilla/show_bug.cgi?id=50026 это означает, что отображение сервлета (кроме '/') для сервлета по умолчанию ведет себя иначе в Tomcat 6.0.29 (и более ранних версиях) по сравнению с более поздними версиями.

0 голосов
/ 15 мая 2009

Я бы рекомендовал использовать фильтр вместо сервлета по умолчанию, когда это возможно.

Другие две возможности:

Напишите FileServlet самостоятельно. Вы найдете множество примеров, он должен просто открыть файл по URL и записать его содержимое в выходной поток. Затем используйте его для обслуживания статического запроса файла.

Создание класса FileServlet, используемого Google App Engine и службой вызовов (запрос, ответ) для этого FileServlet, когда вам нужно предоставить статический файл по заданному URL-адресу.

Вы можете сопоставить / res / * с YourFileServlet или любым другим, чтобы исключить его из обработки DispatcherServlets, или вызвать его напрямую из DispatcherServlet.

И я должен спросить, что в документации Spring говорится об этом столкновении? Я никогда не использовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...