Ответ 1
Вот конкретный пример того, когда Падение назад на "Сервлет по умолчанию" для обслуживания ресурсов не применимо.
Это типичная реализация вышеупомянутого подхода:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
return;
}
Однако актуальная передовая практика для обработки 404 ошибок в Spring 4 заключается в использовании setThrowExceptionIfNoHandlerFound
:
@Override
protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext)
{
DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
return dispatcherServlet;
}
К сожалению, согласно документации для DispatcherServlet:
Обратите внимание, что если
DefaultServletHttpRequestHandler
, то запросы всегда будет перенаправлен на сервлет по умолчанию иNoHandlerFoundException
никогда не будет брошен в этом случае.
В самом деле, это так. Объединение обоих этих подходов не приводит к срабатыванию NoHandlerFoundException
, и это, в свою очередь, препятствует разрешению моей страницы ошибок 404. Теперь, если я должен был прокомментировать мой метод configureDefaultServletHandling
, будет сброшен NoHandlerFoundException
, и моя обработка ошибок (через @ControllerAdvice
, как показано в связанном ответе) разрешится к моей пользовательской 'notFoundPage'.
К сожалению, теперь это означает, что мои статические ресурсы (т.е. "default.css" ) не разрешены:
DEBUG org.springframework.web.servlet.DispatcherServlet - Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'notFoundPage'; model is {}
org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /webapp-test/style/default.css
Я не вижу никакого способа примирить эти два подхода, чтобы они не мешали друг другу. Мое заключение заключается в том, что подход "Сервлет по умолчанию" не подходит для обслуживания статических ресурсов в этом случае, что оставляет нам метод addResourceHandlers
.
Среди преимуществ использования метода addResourceHandlers
:
- ... обслуживать статические ресурсы из других мест, отличных от корня веб-приложения, включая местоположения в пути к классам.
- Свойство cache-period может использоваться для установки больших будущих заголовков срока действия, чтобы клиент мог более эффективно использовать его.
- Обработчик также правильно оценивает заголовок Last-Modified (если он есть), так что код состояния 304 будет возвращен соответствующим образом, избегая ненужных накладных расходов для ресурсов, которые уже кэшированы клиентом.