Вызов фильтров сервлета из другого сервлета - PullRequest
1 голос
/ 05 мая 2020

Я работаю над CMS.

Мой код находится внутри функции doGet() сервлета, вызванного по url "/market". Я хочу, чтобы HttpServletRequestWrapper проходил через все фильтры, установленные для url "/page".

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

Я нахожусь на сервере Tomcat, поэтому я должен иметь возможность выполнять приведение к нужному специальному объекту, и мне не нужно быть совместимым с другими серверами.

Связанный вопрос заключается в том, что использование req.getRequestDispatcher(path).forward(requestWrapper, responseWrapper);, я ожидал, что фильтры вызовут. Должны ли они? Javado c говорит:

Этот метод позволяет одному сервлету выполнить предварительную обработку запроса

1 Ответ

1 голос
/ 06 мая 2020

Фильтры по умолчанию отображаются только на диспетчере REQUEST. Приведенный ниже пример сопоставления фильтра

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

неявно эквивалентен

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

Это означает, что фильтр срабатывает только по «сырому» входящему запросу, а не по перенаправленному запросу. .

Есть еще три диспетчера: FORWARD, INCLUDE и ERROR. RequestDispatcher#forward() запускает диспетчер FORWARD. Если вы хотите, чтобы ваш фильтр также подключился к этому, просто добавьте его:

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Обратите внимание, что вам нужно явно указать здесь диспетчер REQUEST, иначе он будет считать, что вы ' переопределяя его полностью и интересует только диспетчер FORWARD.

Внутри фильтра, если вы хотите различать guish между REQUEST и FORWARD, тогда вы можете затем проверьте это, определив наличие атрибута запроса с ключом RequestDispatcher#FORWARD_REQUEST_URI

String forwardRequestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

if (forwardRequestURI != null) {
    // Forward was triggered on the given URI.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...