search
LoginSignup
0

posted at

updated at

【Java】SpringでInterceptorを使って特定のセッション情報がないときのリダイレクトを行う

はじめに

本記事ではSpringでInterceptorを使用し、特定のセッション情報が存在しない場合のトップページへのリダイレクト処理を行う方法を紹介します。

経緯

Spring Web MVCで各Contorllerがセッション情報を利用した処理を行う場合、適切なnullチェックを行わないとすぐにNullPointerExceptionが吐かれます。
そこで、Interceptorを使った前処理でセッション情報がnullのパターンを弾き、適当なページにリダイレクトする方法を調べました。

結論

以下の2つのクラスを作成すればOKです。

Interceptorによる処理を実装するクラス
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;
	}

}
InterceptorをSpringの設定に追加するクラス
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

HandlerInterceptorimplementsし、Interceptorとしての機能を実装します。
preHandleメソッドは各Controllerの前処理として呼ばれるので、ここに今回実装したい処理(セッション情報の確認)を書きます。
ちなみに、他にも後処理用のメソッドであるpostHandleafterCompletionが存在しますが、今回は使わないので省略しています。

WebMvcConfig

WebMvcConfigurerimplementsし、Springの追加設定を記述します。
今回はSessionCheckInterceptorを有効にしたいのでaddInterceptorsメソッドを実装します。
InterceptorRegistry#addInterceptorSessionCheckInterceptorを追加し、続くaddPathPatternsexcludePathPatternsで有効なパス/無効なパスを指定します。
なお、パスを指定しない場合は全てのパスでSessionCheckInterceptorが有効になります。
今回の実装ではパスの指定を忘れるとトップページで無限ループが発生するのでご注意ください。

まとめ

  • Controllerに共通の前処理を行いたい場合はHandlerInterceptorの実装クラスを作成しよう
  • 作成したInterceptorクラスはWevMvcConfigurerの実装クラスで設定しよう
  • addInterceptorsの有効パスの指定忘れに注意!

参考文献

SpringBoot メソッドの前後で処理する(インターセプター)
SpringでInterceptorを使う

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0