Exemple d’intercepteurs de gestionnaires Spring MVC

Exemple d'intercepteurs de gestionnaire Spring MVC

Spring MVC vous permet d'intercepter les requêtes Web via des intercepteurs de gestionnaires. L'intercepteur de gestionnaire doit implémenter l'interfaceHandlerInterceptor, qui contient trois méthodes:

  1. preHandle() - Appelé avant l'exécution du gestionnaire, retourne une valeur booléenne, «true»: continue la chaîne d'exécution du gestionnaire; «False», arrêtez la chaîne d'exécution et renvoyez-la.

  2. postHandle() - Appelé après l'exécution du gestionnaire, permet de manipuler l'objet ModelAndView avant de le rendre pour afficher la page.

  3. afterCompletion() - Appelé après la fin de la demande complète. Rarement utilisé, je ne trouve aucun cas d'utilisation.

Dans ce didacticiel, vous allez créer deux intercepteurs de gestionnaire pour montrer l'utilisation desHandlerInterceptor.

  1. ExecuteTimeInterceptor - Intercepte la requête Web et consigne l'heure d'exécution du contrôleur.

  2. MaintenanceInterceptor - Intercepte la requête Web, vérifie si l'heure actuelle se situe entre l'heure de maintenance, si oui, redirige-la vers la page de maintenance.

Note
Il est recommandé d'étendre lesHandlerInterceptorAdapter pour les implémentations par défaut pratiques.

1. ExecuteTimeInterceptor

Interceptez les exécutions avant et après le contrôleur, enregistrez le début et la fin du temps d'exécution, enregistrez-le dans le modelAndView du contrôleur intercepté existant pour un affichage ultérieur.

Fichier: ExecuteTimeInterceptor.java

package com.example.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{

    private static final Logger logger = Logger.getLogger(ExecuteTimeInterceptor.class);

    //before the actual handler will be executed
    public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler)
        throws Exception {

        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);

        return true;
    }

    //after the handler is executed
    public void postHandle(
        HttpServletRequest request, HttpServletResponse response,
        Object handler, ModelAndView modelAndView)
        throws Exception {

        long startTime = (Long)request.getAttribute("startTime");

        long endTime = System.currentTimeMillis();

        long executeTime = endTime - startTime;

        //modified the exisitng modelAndView
        modelAndView.addObject("executeTime",executeTime);

        //log it
        if(logger.isDebugEnabled()){
           logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
        }
    }
}

2. MaintenanceInterceptor

Intercepter avant l'exécution du contrôleur, vérifier si l'heure actuelle est comprise entre l'heure de maintenance, si oui, la rediriger vers la page de maintenance; sinon continuer la chaîne d'exécution.

Fichier: MaintenanceInterceptor.java

package com.example.common.interceptor;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MaintenanceInterceptor extends HandlerInterceptorAdapter{

    private int maintenanceStartTime;
    private int maintenanceEndTime;
    private String maintenanceMapping;

    public void setMaintenanceMapping(String maintenanceMapping) {
        this.maintenanceMapping = maintenanceMapping;
    }

    public void setMaintenanceStartTime(int maintenanceStartTime) {
        this.maintenanceStartTime = maintenanceStartTime;
    }

    public void setMaintenanceEndTime(int maintenanceEndTime) {
        this.maintenanceEndTime = maintenanceEndTime;
    }

    //before the actual handler will be executed
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler)
        throws Exception {

        Calendar cal = Calendar.getInstance();
        int hour = cal.get(cal.HOUR_OF_DAY);

        if (hour >= maintenanceStartTime && hour <= maintenanceEndTime) {
            //maintenance time, send to maintenance page
            response.sendRedirect(maintenanceMapping);
            return false;
        } else {
            return true;
        }

    }
}

3. Activer l'intercepteur de gestionnaire

Pour l'activer, placez votre classe d'intercepteur de gestionnaire dans la propriété de mappage de gestionnaire "interceptors".



    
        
            
                welcomeController
            
        
        
            
                
                
            
        
    

    
        
            
                
            
        
    

    
    

    

    
        
        
        
    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

Télécharger le code source

Téléchargez-le -http: //www.example.com/wp-content/uploads/2010/07/SpringMVC-HandlerInterceptor-Example.zip [SpringMVC-HandlerInterceptor-Example.zip] (8 Ko)