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

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

@WebServlet("/*")

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

2 ответа

Решение

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

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

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

Это прекрасно работает для меня.

Другие вопросы по тегам