[Продвинутые базовые принципы 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
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода