Spring MVC, как обойти DispatcherServlet для * .html файлов? - PullRequest
13 голосов
/ 13 декабря 2010

фрагмент 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 запросы. Как мне это сделать? Благодарю.

Ответы [ 5 ]

24 голосов
/ 07 мая 2012

В Spring MVC 3.x для решения этой проблемы есть обработчик сервлетов по умолчанию .

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

<mvc:default-servlet-handler/>
5 голосов
/ 14 декабря 2010

Отобразите это на более конкретную 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.
}
2 голосов
/ 22 января 2015

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

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

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

<context:annotation-config />
<context:component-scan base-package="org.civitana.controller" />
2 голосов
/ 09 марта 2014
<url-pattern>/*</url-pattern> 

Может ловить как /index, /*.html, /*.jsp ... и отдавать DispatcherServlet.

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

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

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

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

<!-- 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 (будет совпадать только последний).

...