Spring MVCハンドラーインターセプターの例
Spring MVCでは、ハンドラーインターセプターを介してWeb要求をインターセプトできます。 ハンドラーインターセプターは、3つのメソッドを含むHandlerInterceptorインターフェイスを実装する必要があります。
-
preHandle() –ハンドラーの実行前に呼び出され、ブール値「true」を返します。ハンドラーの実行チェーンを続行します。 「false」の場合、実行チェーンを停止して返します。
-
postHandle() –ハンドラーの実行後に呼び出され、ページを表示するためにレンダリングする前にModelAndViewオブジェクトを操作できるようにします。
-
afterCompletion() –完全な要求が終了した後に呼び出されます。 めったに使用せず、ユースケースを見つけることができません。
このチュートリアルでは、HandlerInterceptorの使用法を示す2つのハンドラーインターセプターを作成します。
-
ExecuteTimeInterceptor – Web要求をインターセプトし、コントローラーの実行時間をログに記録します。
-
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"プロパティに配置します。
ソースコードをダウンロード
ダウンロード-http://www.example.com/wp-content/uploads/2010/07/SpringMVC-HandlerInterceptor-Example.zip [SpringMVC-HandlerInterceptor-Example.zip](8 KB)