Как предотвратить статические ресурсы от обработки сервлетом переднего контроллера, который отображается на/*

У меня есть сервлет, который действует как передний контроллер.

@WebServlet("/*")

Однако это также обрабатывает файлы CSS и изображений. Как я могу предотвратить это?

Ответ 1

У вас есть 2 варианта:

  • Используйте более конкретный шаблон URL, например /app/* или *.do, а затем пусть все ваши запросы на страницы соответствуют этому шаблону URL. См. Также веб-приложения с шаблонами проектирования

  • То же, что и 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.
    }
    

    См. также Как получить доступ к статическим ресурсам при сопоставлении глобального сервлет-контроллера в /*.

Ответ 2

Я знаю, что это старый вопрос, и я думаю, что ответ @BalusC, вероятно, отлично работает. Но я не могу изменить URL-адрес приложения JSF, над которым я работаю, поэтому просто просто проверяю путь и возвращаю, если это статические ресурсы:

    String path = request.getRequestURI().substring(request.getContextPath().length());
    if (path.contains("/resources/")) {
        return;
    }

Это отлично работает для меня.