[Java] Spring BootでInterceptorを使う方法

はじめに

こんにちは、新卒2年目の岡崎です。

Interceptorを使用すると、コントローラーで処理を実行する前後に共通の処理を行うことができます。今回は、Spring BootでInterceptorを使う方法をご紹介します。

環境

openjdk version "21.0.2" 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-21.0.2.13.1 (build 21.0.2+13-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.2.13.1 (build 21.0.2+13-LTS, mixed mode, sharing)
  • Spring boot
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.1)
  • gradle
------------------------------------------------------------
Gradle 8.5
------------------------------------------------------------

Build time:   2023-11-29 14:08:57 UTC
Revision:     28aca86a7180baa17117e0e5ba01d8ea9feca598

Kotlin:       1.9.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          21.0.2 (Amazon.com Inc. 21.0.2+13-LTS)
OS:           Mac OS X 12.3 aarch64

実装方法

最初に、Interceptorの作成を行います。Interceptorを作成する際には、HandlerInterceptorインターフェースを実装します。Interceptorでは、以下の三つのメソッドが実装できます。

preHandle

preHandleでは、コントローラーで処理を実行する前に割り込み、共通の処理を実行できます。

postHandle

postHandleでは、コントローラーで処理を実行した後に、共通の処理を実行できます。ただし、コントローラーで例外が発生した場合、処理は実行できません。

afterCompletion

afterCompletionでは、レスポンスが完了した後に、共通の処理を実行できます。コントローラーで例外が発生した場合でも、処理を実行できます。

以下は、全てのレスポンスにContent-Typetext/html; charset=utf-8に設定する方法の例です。

まず、Interceptorの作成を行います。

@Configuration
public class SampleInterceptor implements HandlerInterceptor {
    @Override
    public void postHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler,
            ModelAndView modelAndView
    ) throws Exception {
        response.setHeader("Content-Type", "text/html; charset=utf-8");
    }
}

Interceptorを登録するには、WebMvcConfigurerインターフェースを実装するクラスを作成します。このクラスでaddInterceptorsメソッドをオーバーライドして、作成したInterceptorを登録します。

@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
    private final SampleInterceptor sampleInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sampleInterceptor);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseTrailingSlashMatch(true);
    }
}

全てのレスポンスにContent-Typetext/html; charset=utf-8に設定できていたら、実装完了です。

最後に

Spring BootでInterceptorを使用する方法を紹介しました。コントローラーで毎回同じ処理を実装するのは効率的ではありませんし、どこかで間違いが生じる可能性もあります。そこで、こういった共通処理をInterceptorにまとめて実装する方法を検討してみてはいかがでしょうか。

また、エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります。

wantedly.com