Паттерн «Перехватывающий фильтр»
Паттерн перехватывающего фильтра используется для выполнения некоторой предварительной/последующей обработки запроса или ответа приложения. Определите фильтры и примените их к запросу перед передачей его фактическому целевому приложению. Фильтры могут выполнять аутентификацию/авторизацию/логирование или отслеживать запрос, а затем передавать запрос соответствующему обработчику. Ниже приведены сущности этого паттерна проектирования.
- Filter- Фильтр выполняет определенные задачи до или после того, как обработчик запроса выполнит запрос.
- Цепочка фильтров- Цепочка фильтров содержит несколько фильтров и выполняет их на целевом объекте в заданном порядке.
- Целевой объект- Целевой объект является обработчиком запроса.
- Менеджер фильтров (Filter Manager)- Менеджер фильтров управляет фильтрами и цепочкой фильтров.
- Клиент- Клиент — это объект, который отправляет запрос целевому объекту.
summary
назначение
Используется для предварительной и последующей обработки запроса через серию фильтров, прежде чем он достигнет конечного пункта назначения.
Основная решаемая проблема
- Решает проблему необходимости выполнения общих операций (таких как логирование, проверки безопасности, управление транзакциями и т. д.) до и после обработки запроса в веб-приложениях.
Сценарий использования
- Когда необходимо вставить дополнительную логику в поток обработки запроса, и эта логика не связана с бизнес-логикой.
Подход к реализации
- Цепочка фильтров: Серия фильтров выполняется в определённом порядке.
- Фильтр: Компоненты, которые выполняют предварительную и последующую обработку запросов и ответов.
- Целевой объектКонечный пункт назначения обработки запроса.
Ключевой код
- Интерфейс фильтра: Определяет методы, которые фильтры должны реализовать, такие как
before()иafter()。 - Конкретный фильтр: реализует интерфейс фильтра и содержит конкретную логику обработки.
- Менеджер фильтров: отвечает за поддержание цепочки фильтров и порядок вызова фильтров.
Пример приложения
- Сервер веб-приложений: например, Tomcat использует фильтры для перехвата и обработки запросов, таких как проверка прав, журналирование и т. д.
Преимущества
- Разделение ответственности: отделяет общие операции от бизнес-логики, повышая сопровождаемость кода.
- Расширяемость: фильтры можно гибко добавлять, удалять или изменять.
- Повторное использование: фильтры можно повторно использовать в различных процессах обработки запросов.
Недостатки
- Влияние на производительность: если цепочка фильтров слишком длинная или выполняемые фильтрами операции сложны, производительность может пострадать.
Рекомендации по использованию
- Когда нужно вставить общие операции, не связанные с бизнес-логикой, в поток обработки запросов, рассмотрите использование паттерна перехватывающего фильтра.
Примечания
- Убедитесь, что порядок выполнения фильтров соответствует ожиданиям, чтобы избежать логических ошибок.
Основные задействованные роли
-
Интерфейс фильтра:
- Определяет методы, которые должны реализовать фильтры.
-
Конкретный фильтр:
- Реализует интерфейс фильтра, содержащий конкретную логику обработки.
-
Менеджер фильтров:
- Отвечает за поддержание цепочки фильтров и вызов фильтров.
-
Целевой объект:
- Конечный пункт назначения обработки запроса, реализация бизнес-логики.
-
Клиент (необязательно):
- Веб-браузер или API-клиент, отправляющий запрос.
Шаблон «Перехватывающий фильтр» помогает сохранять бизнес-логику ясной и целенаправленной, вставляя общие операции в поток обработки запросов.
Реализация
Мы создадимFilterChain、FilterManager、Target、ClientРазличные объекты, выступающие в качестве сущностей представления.AuthenticationFilterиDebugFilterПредставляют фильтр-сущность.
InterceptingFilterDemoИспользование классаClientДля демонстрации шаблона проектирования «Перехватывающий фильтр».
Шаг 1
Создайте интерфейс Filter.
Filter.java
Шаг 2
Создайте фильтр сущности.
AuthenticationFilter.java
DebugFilter.java
Шаг 3
Создать Target.
Target.java
Шаг 4
Создать цепочку фильтров.
FilterChain.java
Шаг 5
Создайте менеджер фильтров.
FilterManager.java
Шаг 6
Создайте клиент Client.
Client.java
Шаг 7
ИспользованиеClientЧтобы продемонстрировать шаблон проектирования «Перехватывающий фильтр».
InterceptingFilterDemo.java
Шаг 8
Выполните программу и выведите результат:
Authenticating request: HOME request log: HOME Executing request: HOMEДругие расширения