Пример перехватчиков обработчика Spring MVC

Пример перехватчиков обработчиков Spring MVC

Spring MVC позволяет перехватывать веб-запросы через обработчики-перехватчики. Перехватчик обработчика должен реализовывать интерфейсHandlerInterceptor, который содержит три метода:

  1. preHandle() - вызывается перед выполнением обработчика, возвращает логическое значение «истина»: продолжить цепочку выполнения обработчика; «False», остановить цепочку выполнения и вернуть ее.

  2. postHandle() - вызывается после выполнения обработчика, позволяет манипулировать объектом ModelAndView перед его отображением для просмотра страницы.

  3. afterCompletion() - вызывается после завершения полного запроса. Редко, не могу найти ни одного варианта использования.

В этом руководстве вы создадите два перехватчика-обработчика, чтобы показать использованиеHandlerInterceptor.

  1. ExecuteTimeInterceptor - перехватить веб-запрос и записать время выполнения контроллера.

  2. 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".



    
        
            
                welcomeController
            
        
        
            
                
                
            
        
    

    
        
            
                
            
        
    

    
    

    

    
        
        
        
    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

Скачать исходный код

Загрузите его - http://www.example.com/wp-content/uploads/2010/07/SpringMVC-HandlerInterceptor-Example.zip [SpringMVC-HandlerInterceptor-Example.zip] (8 КБ)