[Весна] Веб-разработка — Interceptor

перехватчик

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

1. Сценарии применения

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

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

2) Мониторинг производительности: иногда система необъяснимо медленно работает в течение определенного периода времени.Вы можете записать время начала перед входом в программу обработки через перехватчик и записать время окончания после обработки, чтобы получить время обработки запрос (при наличии обратного прокси, такого как Apache, может автоматически записывать).

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

4) OpenSessionInView: например, Hibernate, открывает сеанс (сеанс) при входе в обработчик и закрывает сеанс после завершения.

2. Введение в HandlerInterceptor

Spring Boot определяет интерфейс HandlerInterceptor для реализации функции пользовательских перехватчиков. Интерфейс HandlerInterceptor определяет три метода: preHandle, postHandle и afterCompletion.Переписывая эти три метода, реализуются такие операции, как предварительный запрос и пост-запрос.

1) preHandle: метод обратного вызова предварительной обработки реализует предварительную обработку обработчика (например, проверку входа), а третий параметр — обработчик ответа.

Возвращаемое значение: true означает продолжение процесса (например, вызов следующего перехватчика или обработчика); false означает, что процесс прерван (например, проверка входа не удалась) и не будет продолжать вызывать другие перехватчики или обработчики. ответ должен быть сгенерирован через response .

2) postHandle: метод обратного вызова постобработки, реализующий постобработку обработчика (но перед рендерингом представления), в это время данные модели или представление могут быть обработаны через modelAndView (объекты модели и представления), и modelAndView также может быть нулевым.

3) afterCompletion: метод обратного вызова после обработки всего запроса, то есть обратный вызов при завершении рендеринга вида.Например, в мониторинге производительности здесь можно записать время окончания и вывести время потребления, а также можно выполнить некоторые очистка ресурсов, похожая на try-catch-finally в finally, но только вызывает обработчик для выполнения preHandle и возвращает afterCompletion перехватчика, соответствующий true.

Иногда нам нужно реализовать только один из трех методов обратного вызова. Если мы реализуем интерфейс HandlerInterceptor, мы должны реализовать три метода независимо от того, нужны ли они нам. В настоящее время Spring предоставляет адаптер HandlerInterceptorAdapter (реализация шаблона проектирования адаптера ), что позволяет нам реализовать только требуемый метод обратного вызова.

3. Используйте HandlerInterceptor для реализации перехватчиков

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

Во-первых, создайте собственный перехватчик входа в систему, пример кода выглядит следующим образом:

public class LoginInterceptor implements HandlerInterceptor {
    
    
    /*注册拦截器*/
    public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        Object user = request.getSession().getAttribute("user");
        if (user == null){
    
    
        request.setAttribute("msg","您没有权限这么做!");
        request.getRequestDispatcher("/").forward(request,response);
        	return false;
        }
        return true;
    }
}

В приведенном выше примере LoginInterceptor наследует интерфейс HandlerInterceptor, реализует интерфейс preHandle и проверяет статус сеанса пользователя. Если у текущего пользователя есть данные для входа, вы можете продолжить доступ; если у текущего пользователя нет данных для входа, верните Нет разрешения.

Затем внедрите перехватчик в конфигурацию системы.

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

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        registry.addInterceptor(new LoginInterceptor())
        .addPathPatterns("/**").excludePathPatterns("/", "/user/login", "/asserts/**", "/webjars/**");
    }
}

Вставьте новый настроенный перехватчик LoginInterceptor в систему с помощью метода addInterceptors класса WebMvcConfigurer.

addPathPatterns определяет адрес перехваченного запроса.

Функция excludePathPatterns заключается в том, чтобы исключить блокировку определенных адресов, например, адрес входа /user/login не требует проверки входа.

Acho que você gosta

Origin blog.csdn.net/weixin_45627039/article/details/131909776
Recomendado
Clasificación