Как мне фильтровать все входящие запросы, а не только те, которые сопоставлены сервлетам?

#java #servlets #jetty #servlet-filters

#java #сервлеты #jetty #servlet-фильтры

Вопрос:

Я играю со встроенным Jetty и мне интересно, почему мой фильтр только перехватывает /hi , а не какой-либо другой входящий запрос. Вот мой пример:

Без фильтра:

 localhost:8080/hi
=> "Hello"
localhost:8080/foo
=> 404
  

С помощью Filter:

 localhost:8080/hi
=> "Hello from filter"
localhost:8080/foo
=> 404
  

Я бы ожидал, что последний 404 вернет «Привет от filter». Чего мне не хватает?

 Server server=new Server(8080);

ServletContextHandler context=
    new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/");
context.addFilter(DispatchFilter.class,"/*",1);
context.addServlet(HelloServlet.class,"/hi");

server.setHandler(context);
server.start();
server.join();
  

Для дальнейшего пояснения, мой пример — это просто упрощенное представление того, что я хочу сделать. Мое намерение состоит в том, чтобы DispatchFilter перехватывать каждый запрос. Если определенные критерии не выполняются, то он должен двигаться дальше, в противном случае возвращает что-то производное от пути запроса.

Комментарии:

1. Ошибка 404 часто возвращается, когда страницы были перемещены или удалены.

2. @Suresh: Я знаю, что означает ошибка 404. Это не применимо к моей проблеме.

Ответ №1:

Из javax.servlet.Фильтр.doFilter()

Метод doFilter фильтра вызывается контейнером каждый раз, когда пара запрос / ответ передается по цепочке из-за запроса клиента на ресурс в конце цепочки.

Ключевая часть здесь — это немного о «конце цепочки». Поскольку /foo не соответствует реальному ресурсу, фильтры не выполняются.

Вы можете обойти это, добавив сервлет по умолчанию:

 context.addServlet(org.mortbay.jetty.servlet.DefaultServlet, "/");
  

Теперь все ваши запросы имеют допустимую конечную точку, и ваш фильтр будет выполнен.

Комментарии:

1. Интересно. Тогда мне любопытно, как фреймворки, подобные Struts2, делают это. struts.apache.org/2.2.1.1/docs/webxml.html

2. Я полагаю, что это работает, потому что серверы приложений обычно имеют сопоставление сервлетов по умолчанию для обслуживания статического содержимого.

3. Ах, да. Jetty предоставляет DefaultServlet класс. После добавления, что все работает, как ожидалось. Спасибо!