Beispiel für Spring MVC-Handler-Interceptors
Mit Spring MVC können Sie Webanforderungen über Handler-Interceptors abfangen. Der Handler-Interceptor muss dieHandlerInterceptor-Schnittstelle implementieren, die drei Methoden enthält:
-
preHandle() - Wird vor der Handlerausführung aufgerufen und gibt den booleschen Wert "true" zurück: Fortsetzung der Handlerausführungskette; "Falsch", stoppen Sie die Ausführungskette und geben Sie sie zurück.
-
postHandle() - Nach der Ausführung des Handlers aufgerufen, können Sie das ModelAndView-Objekt bearbeiten, bevor Sie es zur Ansichtsseite rendern.
-
afterCompletion() - Wird aufgerufen, nachdem die vollständige Anforderung abgeschlossen wurde. Selten verwendet, kann keinen Anwendungsfall finden.
In diesem Tutorial erstellen Sie zwei Handler-Interceptors, um die Verwendung derHandlerInterceptor zu zeigen.
-
ExecuteTimeInterceptor - Fangen Sie die Webanforderung ab und protokollieren Sie die Ausführungszeit des Controllers.
-
MaintenanceInterceptor - Fangen Sie die Webanforderung ab, prüfen Sie, ob die aktuelle Zeit zwischen der Wartungszeit liegt. Wenn ja, leiten Sie sie zur Wartungsseite um.
Note
Es wird empfohlen,HandlerInterceptorAdapter für die praktischen Standardimplementierungen zu erweitern.
1. ExecuteTimeInterceptor
Fangen Sie die Ausführung vor und nach dem Controller ab, protokollieren Sie den Beginn und das Ende der Ausführungszeit und speichern Sie sie für eine spätere Anzeige in modelAndView des vorhandenen abgefangenen Controllers.
Datei: 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. Wartungsinterceptor
Überprüfen Sie vor der Ausführung des Controllers, ob die aktuelle Zeit zwischen der Wartungszeit liegt. Wenn ja, leiten Sie sie auf die Wartungsseite um. andernfalls setzen Sie die Ausführungskette fort.
Datei: 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. Aktivieren Sie den Handler-Interceptor
Um dies zu aktivieren, fügen Sie Ihre Handler-Interceptor-Klasse in die Eigenschaft "interceptors" der Handlerzuordnung ein.
Quellcode herunterladen
Laden Sie es herunter -http: //www.example.com/wp-content/uploads/2010/07/SpringMVC-HandlerInterceptor-Example.zip [SpringMVC-HandlerInterceptor-Example.zip] (8 KB)