開発者ドキュメント

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

Spring MVCを使用すると、ハンドラインターセプタを介してWebリクエストをインターセプトできます。ハンドラインターセプタは、

HandlerInterceptor

インタフェースを実装する必要があります。このインタフェースには、次の3つのメソッドがあります。


  1. preHandle()

    – ハンドラの実行前に呼び出され、ブール値を返します

値、 “true”:ハンドラ実行チェーンを継続する。 “false”、実行チェーンを停止して返します。


  1. postHandle()

    – ハンドラの実行後に呼び出され、操作を許可する

モデルを表示する前にModelAndViewオブジェクトを表示します。


  1. afterCompletion()

    – 要求が完了した後に呼び出されます.

めったに使用することはできません。

このチュートリアルでは、

HandlerInterceptor

の使用方法を示す2つのハンドラインターセプタを作成します。


  1. ExecuteTimeInterceptor

    – Webリクエストをインターセプトし、

コントローラの実行時間。


  1. MaintenanceInterceptor

    – Webリクエストをインターセプトし、

現在の時間がメンテナンス時間の間にある場合は、それをメンテナンスページにリダイレクトします。

1. ExecuteTimeInterceptor

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

ファイル:実行時間Interceptor.java

package com.mkyong.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.メンテナンスインターセプタ

コントローラが実行される前にインターセプトし、現在の時刻がメンテナンス時間の間にあるかどうかを確認し、そうであればそれをメンテナンスページにリダイレクトする。それ以外の場合は実行チェーンを続行します。


File:MaintenanceInterceptor.java

package com.mkyong.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

“プロパティにハンドラインターセプタクラスを配置します。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/welcome.htm">welcomeController</prop>
            </props>
        </property>
        <property name="interceptors">
            <list>
                <ref bean="maintenanceInterceptor"/>
                <ref bean="executeTimeInterceptor"/>
            </list>
        </property>
    </bean>

    <bean
    class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="executeTimeInterceptor"/>
            </list>
        </property>
    </bean>

    <bean id="welcomeController"
                  class="com.mkyong.common.controller.WelcomeController"/>
    <bean class="com.mkyong.common.controller.MaintenanceController"/>

    <bean id="executeTimeInterceptor"
                 class="com.mkyong.common.interceptor.ExecuteTimeInterceptor"/>

    <bean id="maintenanceInterceptor"
                class="com.mkyong.common.interceptor.MaintenanceInterceptor">
        <property name="maintenanceStartTime" value="23"/>
        <property name="maintenanceEndTime" value="24"/>
        <property name="maintenanceMapping" value="/SpringMVC/maintenance.htm"/>
    </bean>

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

ソースコードをダウンロードする

ダウンロードする-

SpringMVC-HandlerInterceptor-Example.zip

(8 KB)

参考文献

ドキュメンテーション]。 link://spring-mvc/spring-mvc-controllerclassnamehandlermapping-example/[ControllerClassNameHandlerMapping

例]。リンク://spring-mvc/spring-mvc-simpleurlhandlermapping-example/[SimpleUrlHandlerMapping

例]

モバイルバージョンを終了