Как заставить ServletFilter работать с файлами приветствия во встроенной Jetty? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть приложение, работающее на встроенной пристани 9.4.12. Объект ServletContextHandler используется для установки файлов приветствия, а также для добавления фильтров сервлетов до того, как обработчик будет установлен на объект Server. Добавляемый список фильтров включает в себя определенные фильтры, которые выполняют аутентификацию входящих запросов. Однако эти фильтры не запускаются на странице приветствия, но работают на других конечных точках.

Соответствующий код инициализации сервера:

ServletContextHandler root = new ServletContextHandler(ServletContextHandler.SESSIONS);
root.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
root.setInitParameter("org.eclipse.jetty.servlet.Default.redirectWelcome", "true");
root.setWelcomeFiles(new String[]{"welcome.html"});
FilterHolder filterHolder = new FilterHolder(
   new AuthFilter());
root.addFilter(filterHolder, "/*", null);
HandlerList handlerList = new HandlerList();
      handlerList.setHandlers(
          new Handler[]{root)
          }
      );
 server.setHandler(handlerList);

Есть ли способ получить AuthFilter фильтр сервлетов здесь для работы на странице welcome.html?

1 Ответ

1 голос
/ 30 марта 2020

AuthFilter будет выполняться для обоих запросов в вашей конфигурации.

Пример:

  1. Вы отправляете запрос GET на /path/to/content/
  2. Соответствие сервлетом для этого запроса является DefaultServlet
  3. Вызывается AuthFilter, затем DefaultServlet (при условии, что вы разрешите работу цепочки)
  4. DefaultServlet обнаруживает, что это запрос к каталогу (а dirAllowed равен false), поэтому он использует список приветствия и выдает ответ о перенаправлении (поскольку для redirectWelcome установлено значение true). (Такое поведение предполагает, что /path/to/content/welcome.html действительно существует, в противном случае это ответ 404)
302 Found HTTP/1.1
Location: /path/to/content/welcome.html
Клиент выполняет перенаправление и отправляет запрос GET на /path/to/content/welcome.html Подходящим сервлетом для этого запроса является DefaultServlet Вызывается AuthFilter, затем DefaultServlet (при условии, что вы разрешаете цепочку работать) DefaultServlet обнаруживает, что это файловый ресурс, и возвращает его содержимое.

Ваш AuthFilter был вызван дважды, один раз для шага 3 и снова для шага 7.

...