Spring MVCハンドラインターセプタの例

Spring MVCハンドラーインターセプターの例

Spring MVCでは、ハンドラーインターセプターを介してWeb要求をインターセプトできます。 ハンドラーインターセプターは、3つのメソッドを含むHandlerInterceptorインターフェイスを実装する必要があります。

  1. preHandle() –ハンドラーの実行前に呼び出され、ブール値「true」を返します。ハンドラーの実行チェーンを続行します。 「false」の場合、実行チェーンを停止して返します。

  2. postHandle() –ハンドラーの実行後に呼び出され、ページを表示するためにレンダリングする前にModelAndViewオブジェクトを操作できるようにします。

  3. afterCompletion() –完全な要求が終了した後に呼び出されます。 めったに使用せず、ユースケースを見つけることができません。

このチュートリアルでは、HandlerInterceptorの使用法を示す2つのハンドラーインターセプターを作成します。

  1. ExecuteTimeInterceptor – Web要求をインターセプトし、コントローラーの実行時間をログに記録します。

  2. MaintenanceInterceptor – Webリクエストをインターセプトし、現在の時刻がメンテナンス時間の間にあるかどうかを確認します。ある場合は、メンテナンスページにリダイレクトします。

Note
便利なデフォルトの実装のために、HandlerInterceptorAdapterを拡張することをお勧めします。

1. ExecuteTimeInterceptor

コントローラーの実行前後をインターセプトし、実行時間の開始と終了を記録し、後で表示するために、既存のインターセプトされたコントローラーのmodelAndViewに保存します。

ファイル: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.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 KB)