Рубрики
Без рубрики

Изменение параметров модели пружины с помощью перехватчика обработчика

Быстрое и практическое руководство по изменению параметров модели пружины с помощью обработчика-интерцептора.

Автор оригинала: baeldung.

1. введение

В этом уроке мы сосредоточимся на Spring MVC HandlerInterceptor. Более конкретно, мы изменим параметры модели Spring MVC до и после обработки запроса.

Если вы хотите прочитать об основах Handlerinterceptors , ознакомьтесь с этой статьей .

2. Зависимости Maven

Чтобы использовать Перехватчики , вам необходимо включить следующий раздел в раздел зависимости вашего pom.xml файл:


    org.springframework
    spring-web
    5.2.8.RELEASE

Последнюю версию можно найти здесь .

Эта зависимость распространяется только на Spring Web, поэтому не забудьте добавить s pring-core и spring-context для полного веб-приложения и библиотеки журналов по вашему выбору.

3. Пользовательская Реализация

Одним из вариантов использования HandlerInterceptor является добавление общих/пользовательских параметров в модель, которые будут доступны в каждом сгенерированном представлении.

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

Давайте начнем с определения нашего нового класса Interceptor :

public class UserInterceptor extends HandlerInterceptorAdapter {

    private static Logger log = LoggerFactory.getLogger(UserInterceptor.class);

    ...
}

Мы расширяем HandlerInterceptorAdapter , так как мы хотим реализовать только методы preHandle() и postHandle () .

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

public static boolean isUserLogged() {
    try {
        return !SecurityContextHolder.getContext().getAuthentication()
          .getName().equals("anonymousUser");
    } catch (Exception e) {
        return false;
    }
}

Когда установлен HttpSession , но никто не вошел в систему, имя пользователя в контексте безопасности Spring равно AnonymousUser . Далее мы приступаем к реализации pre Handle():

3.1. Метод предварительной обработки()

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

@Override
public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object object) throws Exception {
    if (isUserLogged()) {
        addToModelUserDetails(request.getSession());
    }
    return true;
}

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

private void addToModelUserDetails(HttpSession session) {
    log.info("=============== addToModelUserDetails =========================");
    
    String loggedUsername 
      = SecurityContextHolder.getContext().getAuthentication().getName();
    session.setAttribute("username", loggedUsername);
    
    log.info("user(" + loggedUsername + ") session : " + session);
    log.info("=============== addToModelUserDetails =========================");
}

Мы использовали SecurityContextHolder для получения зарегистрированного имени пользователя . Вы можете переопределить реализацию Spring Security UserDetails , чтобы получить электронную почту вместо стандартного имени пользователя.

3.2. Метод postHandle()

После обработки запроса наши параметры модели доступны, поэтому мы можем получить к ним доступ, чтобы изменить значения или добавить новые. Для этого мы используем переопределенный метод postHandle() :

@Override
public void postHandle(
  HttpServletRequest req, 
  HttpServletResponse res,
  Object o, 
  ModelAndView model) throws Exception {
    
    if (model != null && !isRedirectView(model)) {
        if (isUserLogged()) {
        addToModelUserDetails(model);
    }
    }
}

Давайте рассмотрим детали реализации.

Прежде всего, лучше проверить, не является ли модель null. Это предотвратит возникновение NullPointerException .

Кроме того, мы можем проверить, не является ли View экземпляром Redirect View.

Нет необходимости добавлять/изменять параметры после обработки запроса, а затем перенаправлять, так как сразу же новый контроллер снова выполнит обработку. Чтобы проверить, перенаправлено ли представление, мы вводим следующий метод:

public static boolean isRedirectView(ModelAndView mv) {
    String viewName = mv.getViewName();
    if (viewName.startsWith("redirect:/")) {
        return true;
    }
    View view = mv.getView();
    return (view != null && view instanceof SmartView
      && ((SmartView) view).isRedirectView());
}

Наконец, мы снова проверяем, зарегистрирован ли пользователь, и если да, мы добавляем параметры в модель Spring:

private void addToModelUserDetails(ModelAndView model) {
    log.info("=============== addToModelUserDetails =========================");
    
    String loggedUsername = SecurityContextHolder.getContext()
      .getAuthentication().getName();
    model.addObject("loggedUsername", loggedUsername);
    
    log.trace("session : " + model.getModel());
    log.info("=============== addToModelUserDetails =========================");
}

Обратите внимание, что ведение журнала очень важно, так как эта логика работает “за кулисами” нашего приложения. Легко забыть, что мы меняем некоторые параметры модели на каждом представлении , не регистрируя их должным образом.

4. Конфигурация

Чтобы добавить наш недавно созданный Перехватчик в конфигурацию Spring, нам нужно переопределить addInterceptors() метод внутри WebConfig класса, реализующего WebMvcConfigurer:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new UserInterceptor());
}

Мы можем достичь той же конфигурации, отредактировав наш файл конфигурации XML Spring:


    

С этого момента мы можем получить доступ ко всем параметрам, связанным с пользователем, во всех сгенерированных представлениях.

Обратите внимание, что если настроено несколько Spring Перехватчиков , метод preHandle() выполняется в порядке конфигурации, тогда как методы postHandle() и afterCompletion() вызываются в обратном порядке.

5. Заключение

В этом руководстве представлен перехват веб-запросов с помощью обработчика Spring MVC для предоставления информации о пользователе.

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

Все примеры и конфигурации доступны здесь на GitHub .

5.1. Статьи в Серии

Все статьи серии:

  • Введение в перехватчики обработчиков Spring MVC
  • Изменение параметров модели пружины с помощью перехватчика обработчика (этот)