LoginSignup
2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-06-14

はじめに

本記事では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を使う

2
0
0

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
  3. You can use dark theme
What you can do with signing up
2
0