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

Использование пользовательского перехватчика обработчика Spring MVC для управления сеансами

Краткое и практическое руководство по управлению сеансами с помощью HandlerInterceptor Spring MVC

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

1. введение

В этом уроке мы сосредоточимся на Spring MVC HandlerInterceptor.

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

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

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

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


    org.springframework
    spring-web
    5.2.8.RELEASE

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

3. Пользовательская реализация тайм-аутов сеанса

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

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

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

private static final long MAX_INACTIVE_SESSION_TIME = 5 * 10000;

Мы установили его на 50 секунд для целей тестирования; не забывайте, что он подсчитывается в мс.

Теперь нам нужно отслеживать каждую сессию в нашем приложении, поэтому нам нужно включить этот весенний интерфейс:

@Autowired
private HttpSession session;

Давайте перейдем к методу preHandle () .

3.1. Предплечье()

В этот метод мы включим следующие операции:

  • настройка таймеров для проверки времени обработки запросов
  • проверка входа пользователя в систему (с помощью метода UserInterceptor из этой статьи )
  • автоматический выход из системы, если время неактивного сеанса пользователя превышает максимально допустимое значение

Давайте посмотрим на реализацию:

@Override
public boolean preHandle(
  HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
    log.info("Pre handle method - check handling start time");
    long startTime = System.currentTimeMillis();
    request.setAttribute("executionTime", startTime);
}

В этой части кода мы устанавливаем время начала выполнения обработки. С этого момента мы будем считать количество секунд, чтобы закончить обработку каждого запроса. В следующей части мы приведем логику для времени сеанса, только если кто-то вошел в систему во время своего HttpSession:

if (UserInterceptor.isUserLogged()) {
    session = request.getSession();
    log.info("Time since last request in this session: {} ms",
      System.currentTimeMillis() - request.getSession().getLastAccessedTime());
    if (System.currentTimeMillis() - session.getLastAccessedTime()
      > MAX_INACTIVE_SESSION_TIME) {
        log.warn("Logging out, due to inactive session");
        SecurityContextHolder.clearContext();
        request.logout();
        response.sendRedirect("/spring-rest-full/logout");
    }
}
return true;

Во-первых, нам нужно получить сеанс из запроса.

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

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

Для завершения счетчиков для примера времени обработки мы также реализуем метод post Handle () , который описан в следующем подразделе.

3.2. Постхандл()

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

@Override
public void postHandle(
  HttpServletRequest request, 
  HttpServletResponse response,
  Object handler, 
  ModelAndView model) throws Exception {
    log.info("Post handle method - check execution time of handling");
    long startTime = (Long) request.getAttribute("executionTime");
    log.info("Execution time for handling the request was: {} ms",
      System.currentTimeMillis() - startTime);
}

Реализация проста – мы проверяем время выполнения и вычитаем его из текущего системного времени. Просто не забудьте привести значение модели к long .

Теперь мы можем правильно регистрировать время выполнения.

4. Конфигурация перехватчика

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

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

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


    

Кроме того, нам нужно добавить слушателя, чтобы автоматизировать создание ApplicationContext :

public class ListenerConfig implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        sc.addListener(new RequestContextListener());
    }
}

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

Этот учебник показывает, как перехватывать веб-запросы с помощью Spring MVC HandlerInterceptor для ручного управления сеансами/таймаута.

Как обычно, все примеры и конфигурации доступны здесь, на GitHub .

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

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

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