Spring mvc Как обойти DispatcherServlet для *.html файлов?

фрагмент web.xml

<!-- Handles all requests into the application -->
<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/app-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Он отлично работает, но я не хочу, чтобы диспетчерский сервлет обрабатывал запросы *.html. Как мне это сделать? Благодарю.

Ответ 1

Сопоставьте его более конкретным url-pattern.

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/spring/*</url-pattern>
</servlet-mapping>

Создайте Filter, который отображается на /*.

<filter-mapping>
    <filter-name>Your Dispatcher Filter</filter-name>
    <url-pattern>/*</url-pattern>
<filter-mapping>

Что делает следующее в методе doFilter().

String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.endsWith(".html")) {
    chain.doFilter(request, response); // Just let it go (assuming that files are in real not placed in a /spring folder!)
} else {
    request.getRequestDispatcher("/spring" + uri).forward(request, response); // Pass to Spring dispatcher servlet.
}

Ответ 3

<url-pattern>/*</url-pattern> 

Можно перехватить как /index, /*.html, /*.jsp... и передать DispatcherServlet.

<url-pattern>/</url-pattern> 

Только можно поймать /index, /main... без суффикса.

Ответ 4

Решение Lari (выше) отлично и работает для меня, но вы должны быть очень осторожны с порядком, в котором вы пишете инструкцию, она должна быть в начале документа.

В моем случае было что-то вроде:

<mvc:annotation-driven />
<mvc:default-servlet-handler/>

<context:annotation-config />
<context:component-scan base-package="org.civitana.controller" />

Ответ 5

Попробуйте добавить это в конфигурацию XML Spring:

<!-- This will override the default DefaultAnnotationHandlerMapping that is created,
  -  and not map file extensions automagically -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false"/>
</bean>

Это предотвратит Spring от автоматического сопоставления запросов с .html на ваш контроллер. Например. @RequestMapping(value = "/products/widgets", method = RequestMethod.GET) обычно ловушка URI /products/widgets.html, а также /products/widgets. Добавление вышеупомянутого XML заставляет точное сопоставление шаблонов URI с помощью Spring (только последний будет соответствовать).