Почему мы проверяем фильтры, которые будут применены дважды в sitemesh и других местах?
Простая блок-схема sitemesh ( здесь) показывает, что они проверяют, применяется ли фильтр в первый раз или нет. Я видел эту проверку в коде других фильтров тоже. Я не могу понять ситуацию, когда один и тот же фильтр может быть применен дважды для одного и того же запроса. Пожалуйста, объясни.
1 ответ
Начиная с Servlet 2.4, фильтры могут применяться и к запросу, вызываемому через диспетчер запросов. Если фильтр задан для включения или включения, например, он может выполняться несколько раз. например
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
Так, например, когда запрос обрабатывается сервлетом, и этот сервлет перенаправляет запрос куда-то еще
httpServletRequest.getRequestDispatcher("/products/somewhereElse").forward(httpServletRequest, httpServletResponse);
, тогда фильтр может работать дважды. Один раз для исходного запроса, а затем снова для пересылки, позволяющей указать URL-путь и конфигурацию диспетчера.