Spring MVCを使用すると、ハンドラインターセプタを介してWebリクエストをインターセプトできます。ハンドラインターセプタは、
HandlerInterceptor
インタフェースを実装する必要があります。このインタフェースには、次の3つのメソッドがあります。
-
preHandle()
– ハンドラの実行前に呼び出され、ブール値を返します
値、 “true”:ハンドラ実行チェーンを継続する。 “false”、実行チェーンを停止して返します。
-
postHandle()
– ハンドラの実行後に呼び出され、操作を許可する
モデルを表示する前にModelAndViewオブジェクトを表示します。
-
afterCompletion()
– 要求が完了した後に呼び出されます.
めったに使用することはできません。
このチュートリアルでは、
HandlerInterceptor
の使用方法を示す2つのハンドラインターセプタを作成します。
-
ExecuteTimeInterceptor
– Webリクエストをインターセプトし、
コントローラの実行時間。
-
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)
参考文献
ドキュメンテーション]。
http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/web/portlet/HandlerInterceptor.html
[HandlerInterceptor
ドキュメンテーション]。 link://spring-mvc/spring-mvc-controllerclassnamehandlermapping-example/[ControllerClassNameHandlerMapping
例]。リンク://spring-mvc/spring-mvc-simpleurlhandlermapping-example/[SimpleUrlHandlerMapping
例]