Filter

Problem

  • Как централизованно добавлять изменять реализовать:

    • Logging

    • Authorization

    • Authentication

  • Как добавить дополнительную:

    • Post-processing

    • Pre-processing

Solution

  • Servlet: Filter

Intro

Filter

  • Java-объекты

  • Могут выполнять действия с запросами и ответами перед выполнением Servlet, например:

    • Изменять исходные данные выполняемого запроса

    • Изменять ответ Servlets

    • Блокировать определённые Servlets

Example

Web app with Filter

Situation

Situation 1

Situation

Situation 2

Situation

Situation 3

Filter

jakarta.servlet.Filter

  • Интерфейс, служащий для создания новых фильтров

  • Содержит методы:

    • void init(FilterConfig config)

    • void destroy()

    • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

Life cycle

Life cycle

  • При создании фильтра единожды запускается метод init()

  • При уничтожении фильтра выполняется метод destroy()

  • При каждом обращении к Servlet, с которым связан filter, выполняется метод doFilter()

init()

Метод init() получает на вход объект класса FilterConfig, содержащий исходные данные для фильтра. Данные могут быть получены так же как в Servlet, с помощью метода getInitParameter().

public void init (FilterConfig config) throws ServletException {
    this.config = config;
    String act = config.getInitParameter("active");
    if (act != null) {
        active = (act.toUpperCase().equals("TRUE"));
    }
}

doFilter()

  • Метод выполняет обработку HttpRequest/HttpResponse

  • Объект FilterChain хранит информацию о цепочке фильтров

  • В методе обязательно нужно вызвать метод chain.doFilter(…) для запуска других фильтров и Servlets

public void doFilter (ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    // Код обработки запроса
    chain.doFilter(request, response);
}

Filter Chain

Filter

Filter registration

Filter registration

Filters должны регистрироваться в web.xml аналогично Servlets. Для этого используется тег <filter>. В нем кроме самого filter прописываются исходные параметры:

<filter>
    <filter-name>Encoder</filter-name>
    <filter-class>filter.Utf8EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-true>
    </init-param>
</filter>

Параметры инициализации будут доступны в методе init() filter

Filter registration

  • Зарегистрированный filter должен быть подключен к servlet

  • Подключение можно сделать к одному servlet, или сразу к нескольким

  • Подключение к конкретному servlet выполняется следующим образом

<filter-mapping>
    <filter-name>FilterName</filter-name>
    <servlet-name>ServletName</servlet-name>
</filter-mapping>

Filter registration

Также можно привязать filter к группе servlets и других страниц по адресу:

<filter-mapping>
    <filter-name>FilterName</filter-name>
    <url-pattern>/admin/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

В данном случае filter будет привязан к servlets, адреса которых соответствуют данному url-pattern.

Значения dispatcher:

  • REQUEST - обработка только запросов от пользователя

  • FORWARD - обработка только forward-запросов

Filter registration with Annotation

Для регистрации можно использовать аннотацию @WebFilter

@WebFilter(urlPatterns = "*")
public class Encoder implements Filter {
    // …
}

Authorization and Authentication

Authentication

  • Authentication - проверка соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации (например, имени пользователя и пароля)

Authorization

  • Authorization - проверка и определение полномочий на выполнение некоторых действий (например, чтение файла) в соответствии с ранее выполненное аутентификацией