Цикл RequestDispatcher.forward

2

Я использую

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

чтобы отобразить все запросы на один sevlet, где я выполняю всю работу по аутентификации. но я хочу пропустить некоторый статический контент (например, css файлы). Так что я пробовал их этот sevlet, где находится файл ресурсов

if(isResourceFile){
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("static/" + fileName);
    dispatcher.forward(request, response);
}

но это запустит бесконечный цикл, потому что это снова вызовет тот же sevlet

Есть ли способ обойти это без сопоставления всех файлов ресурсов (css) в web.xml?

Теги:
jsp
servlets
java-ee

3 ответа

0
Лучший ответ

Предполагая, что вы хотите аутентифицировать только JSP файлы, вы можете изменить URL-адрес:

/*.jsp

Я думаю, что лучше справиться с вашей проверкой подлинности, используя фильтр, а не сервлет. И в производственной среде вы должны использовать внешний сервер для статического контента.

  • 0
    Спасибо за быстрый ответ. Я планирую не использовать суффикс .jsp в URL. Я постараюсь использовать фильтр.
  • 1
    Пожалуйста, используйте / как URL-отображение в вашем front-контроллере.
1

url-pattern /* лучше использовать исключительно Filter s, а не Servlet s. Поместите все ваши статические файлы в определенную папку (возможно, она покрыта url-pattern более эффективного FileServlet?), И пусть фильтр проверьте его.

например. (Псевдо)

public void doFilter(request, response, chain) {
    if (requestURI.startsWith("/static")) {
        chain.doFilter(request, response); // Just continue. Do nothing.
    } else {
        request.getRequestDispatcher("/pages").forward(request, response); // Forward to page controller.
    }
}

Надеюсь, что это поможет.

0

Если вы не можете использовать фильтр, и вы должны использовать подстановочный знак '*' в сопоставлении без расширения типа ".jsp", тогда это может сработать для вас:

if(isResourceFile){
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/static/" + fileName);
      dispatcher.forward(request, response);
      return; 
}

Добавление '/' в начале статического каталога даст ему корневой контекст.

  • 0
    Это не работает, как я пытался
Сообщество Overcoder
Наверх
Меню