はじめに
本記事ではSpringでInterceptor
を使用し、特定のセッション情報が存在しない場合のトップページへのリダイレクト処理を行う方法を紹介します。
経緯
Spring Web MVCで各Contorller
がセッション情報を利用した処理を行う場合、適切なnullチェックを行わないとすぐにNullPointerException
が吐かれます。
そこで、Interceptor
を使った前処理でセッション情報がnullのパターンを弾き、適当なページにリダイレクトする方法を調べました。
結論
以下の2つのクラスを作成すればOKです。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class SessionCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {// 各Controllerの処理が始まる前に呼ばれる
if(request.getSession().getAttribute("sessionInfo") == null) { // 必要なセッション情報を確認
response.sendRedirect("index"); // 無ければトップページにリダイレクト
return false; // Controllerは起動しない
}
return true;
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import jp.co.example.interceptor.SessionCheckInterceptor;
@Configuration // アノテーションを忘れずに
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public SessionCheckInterceptor SessionCheckInterceptor() {
return new SessionCheckInterceptor();
}
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(SessionCheckInterceptor()) // interceptorを追加
.addPathPatterns("/*") // 全てのパスパターンを対象に追加
.excludePathPatterns("/index", "/login"); // トップページとログイン画面を対象から除外
}
}
"sessionInfo"
や"/index"
などのパラメータは各自の仕様に合わせて変更してください。
解説
SessionCheckInterceptor
HandlerInterceptor
をimplements
し、Interceptor
としての機能を実装します。
preHandle
メソッドは各Controller
の前処理として呼ばれるので、ここに今回実装したい処理(セッション情報の確認)を書きます。
ちなみに、他にも後処理用のメソッドであるpostHandle
やafterCompletion
が存在しますが、今回は使わないので省略しています。
WebMvcConfig
WebMvcConfigurer
をimplements
し、Springの追加設定を記述します。
今回はSessionCheckInterceptor
を有効にしたいのでaddInterceptors
メソッドを実装します。
InterceptorRegistry#addInterceptor
でSessionCheckInterceptor
を追加し、続くaddPathPatterns
とexcludePathPatterns
で有効なパス/無効なパスを指定します。
なお、パスを指定しない場合は全てのパスでSessionCheckInterceptor
が有効になります。
今回の実装ではパスの指定を忘れるとトップページで無限ループが発生するのでご注意ください。
まとめ
- 各
Controller
に共通の前処理を行いたい場合はHandlerInterceptor
の実装クラスを作成しよう - 作成した
Interceptor
クラスはWevMvcConfigurer
の実装クラスで設定しよう -
addInterceptors
の有効パスの指定忘れに注意!