Как отфильтровать все входящие запросы, а не только те, которые сопоставлены с сервлетами? - PullRequest
3 голосов
/ 17 февраля 2011

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

Без фильтра:

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

С фильтром:

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

Я ожидаю, что последние 404 вернут «Привет из фильтра».Чего мне не хватает?

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 Ответ

5 голосов
/ 17 февраля 2011

С javax.servlet.Filter.doFilter ()

Метод Filter вызывает doFilter при каждой передаче пары запрос / ответ черезцепочка из-за запроса клиента на ресурс в конце цепочки.

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

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

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

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

...