Utilisation d’un intercepteur de gestionnaires Spring Spring personnalisé pour gérer les sessions

1. Introduction

Dans ce tutoriel, nous allons nous concentrer sur le Spring MVC HandlerInterceptor.

Plus spécifiquement, nous allons montrer un cas d’utilisation plus avancé pour l’utilisation d’intercepteurs: nous émulerons une logique de délai d’attente de session en définissant des compteurs personnalisés et en suivant manuellement les sessions.

Si vous souhaitez en savoir plus sur les bases de HandlerInterceptor dans Spring, consultez ce lien:/spring-mvc-handlerinterceptor[article].

2. Dépendances Maven

Pour utiliser Interceptors , vous devez inclure la section suivante dans une section dependencies de votre fichier pom.xml :

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.6.RELEASE</version>
</dependency>

La dernière version peut être trouvée à l’adresse https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-web%22

Cette dépendance ne concerne que Spring Web. N’oubliez pas d’ajouter s _pring-core et spring-context_ pour une application Web complète (minimale).

3. Implémentation personnalisée des délais de session

Dans cet exemple, nous allons configurer la durée maximale d’inactivité pour les utilisateurs de notre système. Passé ce délai, ils seront automatiquement déconnectés de l’application.

Cette logique est juste une preuve de concept - nous pouvons bien sûr obtenir facilement le même résultat en utilisant des délais d’attente de session - mais le résultat n’est pas le but ici, l’utilisation de l’intercepteur l’est

Et ainsi, nous voulons nous assurer que cette session sera invalidée si l’utilisateur n’est pas actif. Par exemple, si un utilisateur oublie de se déconnecter, le compteur de temps inactif empêchera les utilisateurs non autorisés d’accéder au compte. Pour ce faire, nous devons définir constant pour le temps inactif:

private static final long MAX__INACTIVE__SESSION__TIME = 5 **  10000;

Nous l’avons réglé à 50 secondes à des fins de test; n’oubliez pas, c’est compté en ms.

Maintenant, nous devons suivre chaque session dans notre application, nous devons donc inclure cette interface Spring:

@Autowired
private HttpSession session;

Continuons avec la méthode preHandle () .

3.1. preHandle ()

Dans cette méthode, nous inclurons les opérations suivantes:

  • réglage des minuteries pour vérifier le temps de traitement des demandes

  • vérifier si un utilisateur est connecté (en utilisant la méthode UserInterceptor de

ce lien:/spring-model-parameters-with-handler-interceptor[article]) ** déconnexion automatique, si la durée de session inactive de l’utilisateur dépasse

valeur maximale autorisée

Regardons l’implémentation:

@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);
}

Dans cette partie du code, nous définissons le startTime de la gestion de l’exécution.

À partir de ce moment, nous compterons un nombre de secondes pour terminer le traitement de chaque demande. Dans la prochaine partie, nous fournirons une logique pour le temps de session, uniquement si quelqu’un s’est connecté au cours de sa session HTTP:

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;

Premièrement, nous devons obtenir la session à partir de la demande.

Nous passons ensuite à la journalisation de la console, indiquant qui est connecté et combien de temps s’est écoulé depuis que l’utilisateur exécute une opération quelconque dans notre application. Nous pouvons utiliser session.getLastAccessedTime () pour obtenir cette information, la soustraire de l’heure actuelle et la comparer avec notre

Si le temps est plus long que prévu, nous effaçons le contexte, déconnectons la demande, puis envoyons (éventuellement) une redirection en réponse à la vue de déconnexion par défaut, déclarée dans le fichier de configuration Spring Security.

Pour compléter les compteurs pour les exemples de temps de traitement, nous implémentons également la méthode postHandle () , décrite dans la sous-section suivante.

3.2. postHandle ()

Cette méthode est mise en œuvre uniquement pour obtenir des informations sur le temps nécessaire au traitement de la demande en cours. Comme vous l’avez vu dans l’extrait de code précédent, nous définissons executionTime dans le modèle Spring. Il est maintenant temps de l’utiliser:

@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);
}

L’implémentation est simple: nous vérifions une heure d’exécution et la soustrayons d’une heure système actuelle Rappelez-vous simplement de convertir la valeur du modèle en long.

Maintenant, nous pouvons enregistrer le temps d’exécution correctement.

4. Config de l’intercepteur

Pour ajouter notre Interceptor nouvellement créé à la configuration Spring, nous devons redéfinir la méthode addInterceptors () à l’intérieur de la classe WebConfig implémentant WebMvcConfigurer:

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

Nous pouvons obtenir la même configuration en modifiant notre fichier de configuration XML Spring:

<mvc:interceptors>
    <bean id="sessionTimerInterceptor" class="org.baeldung.web.interceptor.SessionTimerInterceptor"/>
</mvc:interceptors>

De plus, nous devons ajouter un auditeur, afin d’automatiser la création du ApplicationContext :

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

5. Conclusion

Ce didacticiel explique comment intercepter des requêtes Web à l’aide de HandlerInterceptor de Spring MVC afin d’effectuer manuellement la gestion/la temporisation de session.

Comme d’habitude, tous les exemples et configurations sont disponibles ici à l’adresse GitHub .

5.1. Articles de la série

Tous les articles de la série:

  • link:/spring-mvc-handlerinterceptor[Introduction à Spring MVC Handler

Intercepteurs]** lien:/spring-model-parameters-with-handler-interceptor[Changer de ressort

Paramètres de modèle avec intercepteur de gestionnaire]** l’article actuel