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:
-
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.
-
postHandle() - Appelé après l'exécution du gestionnaire, permet de manipuler l'objet ModelAndView avant de le rendre pour afficher la page.
-
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.
-
ExecuteTimeInterceptor - Intercepte la requête Web et consigne l'heure d'exécution du contrôleur.
-
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".
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)