Пример перехватчиков обработчиков Spring MVC
Spring MVC позволяет перехватывать веб-запросы через обработчики-перехватчики. Перехватчик обработчика должен реализовывать интерфейсHandlerInterceptor, который содержит три метода:
-
preHandle() - вызывается перед выполнением обработчика, возвращает логическое значение «истина»: продолжить цепочку выполнения обработчика; «False», остановить цепочку выполнения и вернуть ее.
-
postHandle() - вызывается после выполнения обработчика, позволяет манипулировать объектом ModelAndView перед его отображением для просмотра страницы.
-
afterCompletion() - вызывается после завершения полного запроса. Редко, не могу найти ни одного варианта использования.
В этом руководстве вы создадите два перехватчика-обработчика, чтобы показать использованиеHandlerInterceptor.
-
ExecuteTimeInterceptor - перехватить веб-запрос и записать время выполнения контроллера.
-
MaintenanceInterceptor - перехватить веб-запрос, проверить, находится ли текущее время между временем обслуживания, если да, перенаправить его на страницу обслуживания.
Note
Рекомендуется расширитьHandlerInterceptorAdapter для удобных реализаций по умолчанию.
1. ExecuteTimeInterceptor
Перехватите до и после выполнения контроллера, запишите начало и конец времени выполнения, сохраните его в существующем перехваченном контроллере модели AndView для последующего отображения.
Файл: 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
Перехват до выполнения контроллера, проверьте, находится ли текущее время между временем обслуживания, если да, то перенаправьте его на страницу обслуживания; иначе продолжить цепочку выполнения.
Файл: 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. Включить перехватчик обработчика
Чтобы включить его, поместите свой класс перехватчика обработчика в свойство сопоставления обработчика "interceptors".
Скачать исходный код
Загрузите его - http://www.example.com/wp-content/uploads/2010/07/SpringMVC-HandlerInterceptor-Example.zip [SpringMVC-HandlerInterceptor-Example.zip] (8 КБ)