Как предотвратить обработку статических ресурсов сервлетом фронт-контроллера, который отображается на /*
У меня есть сервлет, который выступает в качестве фронт-контроллера.
@WebServlet("/*")
Тем не менее, это также обрабатывает CSS и файлы изображений. Как я могу предотвратить это?
2 ответа
У вас есть 2 варианта:
Используйте более конкретный шаблон URL, такой как
/app/*
или же*.do
и затем пусть все ваши запросы страницы соответствуют этому шаблону URL. См. Также веб-приложения Design PatternsТо же, что 1, но вы хотите скрыть отображение сервлета из URL запроса; Затем вы должны поместить все статические ресурсы в общую папку, такую как
/static
или же/resources
и создайте фильтр, который проверяет, не соответствует ли URL-адрес запроса, а затем пересылает сервлету. Вот пример, который предполагает, что ваш сервлет контроллера является@WebServlet("/app/*")
и что фильтр является@WebFilter("/*")
и что все ваши статические ресурсы находятся в/resources
папка.HttpServletRequest req = (HttpServletRequest) request; String path = req.getRequestURI().substring(req.getContextPath().length()); if (path.startsWith("/resources/")) { chain.doFilter(request, response); // Goes to default servlet. } else { request.getRequestDispatcher("/app" + path).forward(request, response); // Goes to your controller. }
Смотрите также Как получить доступ к статическим ресурсам при отображении сервлета глобального фронт-контроллера в / *.
Я знаю, что это старый вопрос, и я думаю, что ответ @BalusC, вероятно, работает нормально. Но я не мог изменить URL-адрес для приложения JSF, над которым я работаю, поэтому я просто проверяю путь и возвращаюсь, если это к статическим ресурсам:
String path = request.getRequestURI().substring(request.getContextPath().length());
if (path.contains("/resources/")) {
return;
}
Это прекрасно работает для меня.