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
例]