Interceptorとは
SpringFrameworkでは@Controllerアノテーションを付けたControllerクラスがリクエストを受けてレスポンスを返す処理を行う。
ControllerクラスはDispatcherServletがリクエストURLからControllerクラスを抽出して実行する。
Inerceptorは、画面処理の前後とリクエストの一番最後に呼び出される割り込み処理で、Inerceptorを使うとControllerの実行前後に処理を追加することができる。
例えば、アクセス元のIPアドレスをログに出力する場合はInterceptorを使う。
Interceptorの仕組み
実態:org.springframework.web.servlet.HandlerInterceptorインターフェース
HandlerInterceptorインターフェースをDispatcherServletが実行している。
メソッド | 戻り値 | 実行タイミング |
---|---|---|
preHandle | booean | Controller実行前 |
postHandle | void | Controller実行後~viewレンタリング前 |
afterCompletion | void | viewレンタリング後 |
HandlerInterceptorのAPIReference
Interceptorの作成方法
Interceptorを使ってアクセスしてきたIPアドレスをログファイルに出力してみる。
<手順>
- org.springframework.web.servlet.HandlerInterceptorの実装クラスを作成する
- applicationContext.xmlにインタセプターを定義する
なお、SpringMVCプロジェクトは下記の手順で作成したものを使用する
SpringMVCプロジェクト
<今回検証した各モジュールのバージョン情報>
モジュール | version |
---|---|
STS | 3.9.9 |
JDK | 1.8.0_221 |
Tomcat | 8.5 |
SpringFramework | 3.1.1 |
Thymeleaf | 2.1.6 |
Interceptorの作成方法①
org.springframework.web.servlet.HandlerInterceptorの実装クラスを作成し、
preHandleメソッド内でIPアドレスを出力する。
package hogehoge;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class HogeIntercepter implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(HogeIntercepter.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO 自動生成されたメソッド・スタブ
logger.info("URI:" + request.getRequestURI());
logger.info("IPアドレス:" + request.getRemoteAddr());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO 自動生成されたメソッド・スタブ
}
}
Interceptorの作成方法②
applicationContext.xmlにインタセプターを定義する。
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
・
・
・
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<beans:bean class="hogehoge.HogeIntercepter" />
</mvc:interceptor>
</mvc:interceptors>
</beans:beans>