[Продвинутые базовые принципы Spring] Легко освоить механизм перехватчика Spring MVC: глубокое понимание использования интерфейса HandlerInterceptor и класса его реализации.
[Продвинутые базовые принципы Spring] Легко освоить механизм перехватчика Spring MVC: глубокое понимание использования интерфейса HandlerInterceptor и класса его реализации.

Как обычно, давайте сначала на ярком примере объясним роль сегодняшнего главного героя — перехватчика.

Однажды наш главный герой Кункун планировал открыть баскетбольный магазин. Он с радостью подготовил все, от баскетбольного оборудования до стиля оформления, и все это было тщательно продумано. Он решил назвать свой баскетбольный магазин «Баскетбольный магазин Kunkun», надеясь привлечь больше любителей баскетбола. В первый день открытия «Кункуна» баскетбольный магазин принял множество покупателей. Он радостно приветствует всех и знакомит с товарами и услугами магазина. Однако вскоре Кункун обнаружил, что некоторые клиенты могут и не быть настоящими фанатами баскетбола, но хотят воспользоваться возможностью, чтобы устроить неприятности или совершить какие-то незаконные поступки, которые часто называют «маленькими черными человечками». В это время он решил поставить трёх умных и милых Кун Цзявэя у входа в баскетбольный магазин. Известный как «Три куриные ноги», он является правой рукой Кункуна. Эта куриная нога, как вратарь, ловко различает, кто настоящие болельщики, а кто просто маленькие угри, и праведно издевается над фальшивыми фанатами. И вежливо поприветствуйте: «Тебе лучше быть». Когда кто-то заходит в баскетбольный магазин, Кун Цзявэй быстро определяет его цель. Если они настоящие фанаты баскетбола, Interceptor с энтузиазмом проведет их в подходящую зону для стажеров-айдолов и предоставит им услуги. Прежде чем они смогут весело танцевать, сцену и задник необходимо подготовить по своему вкусу. Тех, кто заподозрит подозрения, перехватчик сразу перехватит и предотвратит дальнейшие действия. Наконец, после страстного танца Остаётся Кун Цзявэй. Очистите поле боя, выполните последующие операции и очистите ресурсы.

Из приведенной выше истории мы можем предвидеть появление Kunkun Basketball Store, которое неотделимо от сотрудничества трех Кун Цзявэй. В этом случае давайте также рассмотрим перехватчик SpringMVC, чтобы глубже понять его принципы и возможности. механизмы.

представлять

Перехватчики играют важную роль в Spring MVC, используются для перехвата обработки запросов и ответов и позволяют разработчикам выполнять пользовательскую логику до того, как запрос попадет в контроллер или после того, как он покинет контроллер. Он предоставляет механизм для вставки пользовательского кода на разных этапах жизненного цикла запроса.

По сравнению с фильтрами перехватчики больше ориентированы на обработку логики уровня контроллера. Они тесно связаны с контроллером и могут получать доступ и изменять параметры и возвращаемые значения методов контроллера. Перехватчики часто используются для реализации некоторых общих сквозных задач, таких как аутентификация, проверка разрешений, ведение журналов, мониторинг производительности и т. д.

В Spring MVC перехватчики определяются путем реализации интерфейса HandlerInterceptor. Интерфейс HandlerInterceptor содержит три основных метода:

  1. preHandle: вызывается до того, как запрос достигнет контроллера. Может использоваться для некоторой предварительной обработки, такой как проверка личности, проверка разрешений и т. д. Определите, следует ли продолжать обработку запроса на основе возвращенного результата.
  2. postHandle:существование вызывается после выполнения метода контроллера и перед визуализацией представления.。Данные модели могут быть дополнительно обработаны или изменены.。
  3. afterCompletion: вызывается после завершения всей обработки запроса. Используется для выполнения некоторых операций по очистке ресурса или записи результатов обработки запроса и т. д.

Эти методы вызываются в определенном порядке в цепочке перехватчиков. В случае существования нескольких перехватчиков порядок их выполнения определяется порядком конфигурации перехватчиков. Порядок выполнения цепочки перехватчиков — первый вход, последний выход, то есть перехватчик, настроенный первым, выполняется последним.

Написав собственный класс реализации HandlerInterceptor и настроив его в Spring MVC, разработчики могут гибко управлять логикой обработки запросов. Перехватчики предоставляют подключаемый механизм, который улучшает возможность повторного использования и сопровождения кода и может эффективно решать сквозные задачи.

Конкретная реализация:
Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // существование вызывается до того, как запрос достигнет контроллера
        // Можно выполнить некоторую предварительную обработку, например проверку личности, проверку разрешений и т. д.
        // Возврат false предотвратит дальнейшую обработку запроса, возврат true позволит продолжить обработку запроса.
        String token = request.getHeader("Authorization");
        if (token == null || !isValidToken(token)) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // существование вызывается после выполнения метода контроллера и перед визуализацией представления.
        // Данные модели могут быть дополнительно обработаны или изменены.
        if (modelAndView != null) {
            modelAndView.addObject("customData", "Additional data");
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // существование вызывается после завершения всей обработки запроса
        // Вы можете выполнять какие-то операции по очистке ресурсов или записывать результаты обработки запросов и т. д.
        logRequestCompletion(request, response.getStatus());
    }

    private boolean isValidToken(String token) {
        // Логика токена проверки
        // Возврат true означает, что токен действителен, возврат false означает, что токен недействителен.
        // Это всего лишь пример: реальную бизнес-логику необходимо реализовать в соответствии с конкретными потребностями.
        return true;
    }

    private void logRequestCompletion(HttpServletRequest request, int status) {
        // Логика записи результатов обработки запроса
        // Это всего лишь пример: реальную бизнес-логику необходимо реализовать в соответствии с конкретными потребностями.
        System.out.println("Request completed - URI: " + request.getRequestURI() + ", Status: " + status);
    }
}

Затем мы также можем создать собственный перехватчик для обслуживания бизнеса:

Создайте класс Java, реализующий интерфейс HandlerInterceptor. Например, мы можем создать класс CustomInterceptor:

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Реализуйте метод preHandle для перехвата и обработки существующих запросов до того, как они достигнут контроллера.
        // Здесь можно реализовать необходимую бизнес-логику, такую ​​как проверка личности, проверка разрешений и т. д.
        // Возврат true означает продолжение обработки запроса, возврат false предотвратит продолжение обработки запроса.
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Реализуйте метод postHandle, перехватите и обработайте его после выполнения метода контроллера.
        // существоватьздесь Данные модели могут быть дополнительно обработаны или изменены.
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Реализуйте метод afterCompletion для перехвата и обработки всего запроса после его обработки.
        // существоватьздесь Вы можете выполнять какие-то операции по очистке ресурсов или записывать результаты обработки запросов и т. д.
    }
}

В классе CustomInterceptor вы можете реализовать методы preHandle, postHandle и afterCompletion по мере необходимости для написания конкретной бизнес-логики.

Зарегистрируйте перехватчик в конфигурации Spring MVC. В файле конфигурации Spring MVC (например, файле конфигурации XML или классе конфигурации Java) зарегистрируйте собственный перехватчик, настроив InterceptorRegistry. Вот пример, предполагающий, что вы используете классы конфигурации Java:

Язык кода:javascript
копировать
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // Зарегистрируйте собственный перехватчик
        registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");
    }
}

В приведенном выше примере мы зарегистрировали CustomInterceptor в InterceptorRegistry с помощью метода addInterceptors и использовали метод addPathPatterns для указания перехватываемого шаблона URL-адреса. Здесь «/**» используется для обозначения перехвата всех запросов.

Перехватчики имеют множество сценариев применения в реальных проектах. Помимо аутентификации, они также имеют следующие общие применения, а также конкретные реализации, которые я реализовал в бизнесе:

Ведение журнала: перехватчики могут использоваться для записи информации журнала запросов и ответов, включая запрошенный URL-адрес, параметры, время обработки и т. д. Это полезно для отслеживания и устранения неполадок, оптимизации производительности и статистического анализа.

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Запишите запрошенный URL и параметры
        String url = request.getRequestURL().toString();
        String queryString = request.getQueryString();
        System.out.println("Request URL: " + url);
        System.out.println("Request Parameters: " + queryString);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // существуют Здесь данные ответа могут быть зарегистрированы или обработаны
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // существование Здесь вы можете записывать такую ​​информацию, как время обработки запроса.
    }
}

Управление кешем. Перехватчики можно использовать для управления кешем, например для проверки наличия данных ответа в кеше до того, как запрос достигнет контроллера. Если он существует, возвращайте кэшированные данные напрямую, чтобы избежать повторных вычислений или запросов к базе данных.

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CacheInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Проверьте, сохранены ли существующие данные ответа в кеше
        String cacheKey = generateCacheKey(request);
        Object cachedData = getFromCache(cacheKey);
        if (cachedData != null) {
            // Возврат непосредственно к данным кэша
            writeResponseData(response, cachedData);
            return false; // Завершить запрос, чтобы продолжить обработку
        }
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // существуют Здесь вы можете кэшировать ответные данные
        String cacheKey = generateCacheKey(request);
        Object responseData = extractResponseData(response);
        storeInCache(cacheKey, responseData);
    }

    private String generateCacheKey(HttpServletRequest request) {
        // Генерируйте уникальные ключи кэша на основе запрошенного URL, параметров и т. д.
        // ...
    }

    private Object getFromCache(String cacheKey) {
        // Получить данные из кеша
        // ...
    }

    private void writeResponseData(HttpServletResponse response, Object data) {
        // Напишите данные в ответ
        // ...
    }

    private Object extractResponseData(HttpServletResponse response) {
        // Извлечь данные из ответа
        // ...
    }

    private void storeInCache(String cacheKey, Object data) {
        // Сохранить данные в кэш
        // ...
    }
}

Контроль разрешений. Помимо аутентификации, перехватчики можно использовать для реализации детального контроля разрешений. В методе preHandle вы можете проверить, есть ли у текущего пользователя разрешение на доступ к ресурсу или выполнение операции. Если нет, вы можете вернуть соответствующее сообщение об ошибке или перенаправить на другие страницы.

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthorizationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Проверьте права пользователя
        if (!hasPermission(request)) {
            // Нет разрешений, вернуть сообщение об ошибке или перенаправить на другие страницы.
            response.sendRedirect("/error/unauthorized");
            return false; // Завершить запрос, чтобы продолжить обработку
        }
        return true;
    }

    private boolean hasPermission(HttpServletRequest request) {
        // Проверьте, есть ли у текущего пользователя разрешение на доступ к ресурсу
        // ...
    }
}

Анализ и предварительная обработка параметров запроса. Перехватчики можно использовать для анализа параметров запроса и выполнения некоторых операций предварительной обработки, таких как преобразование формата данных, проверка параметров и т. д. Это помогает разгрузить методы контроллера, чтобы они могли больше сосредоточиться на бизнес-логике.

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestProcessingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Анализ параметров и предварительная обработка
        String param1 = request.getParameter("param1");
        String param2 = request.getParameter("param2");
        // Обработка или проверка параметров
        // ...
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // существуют Здесь данные модели могут быть дополнительно обработаны или изменены.
    }
}

Обработка ошибок. Перехватчики можно использовать для глобальной обработки ошибок, перехвата и обработки исключений. В методе afterCompletion исключения могут обрабатываться единообразно, например, ведение журнала, отправка уведомлений и т. д.

Язык кода:javascript
копировать
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ErrorHandlingInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       // существования Исключения здесь обрабатываются единообразно
        if (ex != null) {
            // Записывать или отправлять уведомления
            System.out.println("Exception occurred: " + ex.getMessage());
        }
    }
}

Некоторые соображения и рекомендации по перехватчикам включают в себя:

  1. Постарайтесь сделать логику перехватчика простой и эффективной и избегать слишком сложной бизнес-обработки. Избыточная бизнес-логика должна обрабатываться на уровне контроллера или сервиса.
  2. Обратите внимание на порядок выполнения перехватчиков, особенно когда несколько перехватчиков работают одновременно. Вы можете использовать аннотацию @Order или реализовать Orderedинтерфейс, чтобы указать порядок выполнения перехватчиков.
  3. Помните о влиянии перехватчиков на производительность. Перехватчики вызываются по цепочке, и каждый перехватчик обрабатывает запрос. Поэтому к производительности перехватчика необходимо относиться осторожно, чтобы избежать ненужных операций и повторных вычислений.
  4. Обработка исключений. Перехватчик должен правильно обрабатывать и инкапсулировать исключения, чтобы он мог правильно возвращать клиенту информацию об ошибках или выполнять унифицированную обработку исключений.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose