Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

これはAIが翻訳した投稿です。

제이온

[Spring] フィルタ、インターセプター、Argument Resolverとは?

言語を選択

  • 日本語
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

durumis AIが要約した文章

  • フィルタは、ディスパッチャサーブレットにリクエストが渡される前後に、URLパターンに合致するすべてのリクエストに対して追加処理を実行できる機能を提供する J2EE標準仕様機能であり、ウェブコンテナで動作します。 一方、インターセプターはSpringが提供する技術であり、ディスパッチャサーブレットがコントローラを呼び出す前後に、 リクエストとレスポンスを参照したり加工したりできる機能を提供し、Springコンテキストで動作します。
  • Argument Resolverは、コントローラにリクエストが来たときに、リクエストに含まれる値から目的のオブジェクトを作成する役割を間接的に担うことができます。
  • フィルタとインターセプターは、Springコンテナで動作するかウェブコンテナで動作するか、 ディスパッチャサーブレットを基準にリクエストを処理するかコントローラを基準にリクエストを処理するかによって違いがあり、 Argument Resolverはインターセプターの後で動作し、特定のオブジェクトを返します。

フィルター (Filter) とは?

フィルターは、J2EE標準仕様機能で、ディスパッチャーサーブレット (Dispatcher Servlet) にリクエストが渡される前後に、 URLパターンに一致するすべてのリクエストに対して、追加の処理を実行できる機能を提供します。つまり、スプリングコンテナではなく、 TomcatなどのWebコンテナによって管理されるため、ディスパッチャーサーブレットに到達する前にリクエストを処理するのです。



フィルター (Filter) の実装

フィルターを追加するには、javax.servlet の Filter インターフェースを実装する必要があります。このインターフェースには、 以下の3つのメソッドがあります。


  • init メソッド
    • フィルターオブジェクトを初期化し、サービスに追加するためのメソッドです。Webコンテナは、1回 init メソッドを呼び出して フィルターオブジェクトを初期化し、その後、リクエストは doFilter() メソッドによって処理されます。
  • doFilter メソッド
    • URLパターンに一致するすべてのHTTPリクエストがディスパッチャーサーブレットに渡される前に、Webコンテナによって実行され、 ディスパッチャーサーブレットからクライアントにHTTP応答が行く前に、Webコンテナによって実行されるメソッドです。
      doFilter() のパラメータには FilterChain があります。FilterChain の doFilter() を使用して、次のターゲットにリクエストを渡します。chain.doFilter() の前後に必要な処理を追加することで、 目的の処理を実行できます。
  • destory メソッド
    • フィルターオブジェクトをサービスから削除し、使用しているリソースを返却するためのメソッドです。これは、Webコンテナによって1回 呼び出され、その後は doFilter() によって処理されなくなります。


サンプルコード - Servlet 仕様

@WebFilter("/*")
public class dolphagoFilter implements Filter {

    @Override
      public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
      public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain filterChain) throws IOException, ServletException {
        //ここに前処理
        request.setCharacterEncoding("UTF-8");
        System.out.println("doFilter() 前....");

        filterChain.doFilter(request, response);

        //ここに後処理
        System.out.println("doFilter() 後....");
      }

    @Override
      public void destroy() {    }


サンプルコード - @Component

@Order(1)
@Component
public class CustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }


  • @Component: フィルターをスプリングBeanとして登録できます。
  • @Order: フィルターが複数ある場合、順番を指定できます。
  • サーブレット仕様に準拠したフィルターをこのようにスプリングBeanとして登録すると、スプリング仕様に準拠した他のBeanを使用できます。


サンプルコード - @Configuration

@Configuration
public class CustomRegistrationBean {

    @Bean
    public FilterRegistrationBean customFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.setOrder(1);
        registration.addUrlPatterns("/api/*");
        return registration;
    }

特定のURIにのみフィルターを動作させたい場合は、FilterRegistrationBeanを使用して、フィルターをスプリングBeanとして登録できます。


フィルター (Filter) の用途

主に、リクエストパラメータ自体の検証と処理を担当します。


  • セキュリティ関連の共通作業
    • フィルターは、Webコンテナで動作するため、セキュリティチェック (XSS、CSRF対策など) を実行し、 不正なリクエストの場合にはブロックできます。スプリングコンテナにリクエストが渡される前にブロックされるため、 セキュリティをさらに強化できます。
  • すべてのリクエストに対するロギング
  • 画像/データの圧縮と文字列エンコーディング
    • フィルターは、画像やデータの圧縮、文字列エンコーディングなど、Webアプリケーション全体で使用する機能を実装しました。
  • ServletRequest のカスタマイズ
    • HttpServletRequest は、Body の内容を1回だけ読み取ることができます。そのため、Filter や Interceptor では、Body を読み取ることができません。Body をロギングするために、カスタムした ServletRequest を作成できます。


インターセプター (Interceptor)

インターセプター (Interceptor) とは?

インターセプター (Interceptor) は、J2EE標準仕様のフィルター (Filter) とは異なり、スプリングが提供する技術です。 ディスパッチャーサーブレットがコントローラーを呼び出す前後に、リクエストとレスポンスを参照したり加工したりできる機能を提供します。 つまり、Webコンテナで動作するフィルターとは異なり、インターセプターはスプリングコンテキストで動作します。


ディスパッチャーサーブレットは、ハンドラーマッピングを通じて適切なコントローラーを見つけ出すようにリクエストしますが、 その結果として、実行チェーン (HandlerExecutionChain) を返します。そのため、この実行チェーンには、1つ以上のインターセプターが登録されている場合、 順次インターセプターを通過してからコントローラーが実行されるようになり、インターセプターがない場合は、すぐにコントローラーが実行されます。


インターセプター (Interceptor) の実装

インターセプターを追加するには、org.springframework.web.servlet.HandlerInterceptor インターフェースを実装する必要があります。このインターフェースには、以下の3つのメソッドがあります。


  • preHandle メソッド
    • preHandle メソッドは、コントローラーが呼び出される前に実行されます。そのため、コントローラーの前に処理する必要がある 前処理作業や、リクエスト情報を加工したり追加したりする場合に使用できます。
    • preHandle メソッドの3番目のパラメータである handler パラメータは、@RequestMapping が付いた メソッドの情報を抽象化したオブジェクトです。
    • preHandle メソッドの戻り値の型は boolean です。戻り値が true の場合、次の段階に進みますが、 false の場合は処理を中止し、以降の処理 (次のインターセプターまたはコントローラー) は実行されません。
  • postHandle メソッド
    • postHandle メソッドは、コントローラーが呼び出された後に実行されます。そのため、コントローラーの後に処理する必要がある 後処理作業がある場合に使用できます。
  • afterCompletion メソッド
    • afterCompletion メソッドは、名前のとおり、すべてのビューで最終的な結果が生成されるのを含め、すべての処理が 完了した後に実行されます。


サンプルコード

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    }
}

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor());
        registry.addInterceptor(new LoggingInterceptor());
    }


  • 作成したインターセプターをBeanとして登録します。
  • WebMvcConfigurer インターフェースの addInterceptors() メソッドに、作成したインターセプターを登録します。
  • インターセプターは、InterceptorRegistry に登録した順に動作します。


インターセプター (Interceptor) の用途

主に、サービスロジックを活用して、リクエスト情報の整合性処理を担当します。


  • 認証/認可などの共通作業
    • 代表的な例として、認証や認可など、クライアントのリクエストに関連する作業を、コントローラーに渡す前に検査できます。
  • API呼び出しに関するロギング
    • 渡される HttpServletRequest、HttpServletResponse オブジェクトを通じて、クライアントの 情報を記録できます。
  • コントローラーに渡すデータの加工
    • 渡される HttpServletRequest、HttpServletResponse オブジェクトを加工して、コントローラーに 渡すことができます。
  • AOP の模倣
    • preHandle() メソッドの3番目のパラメータである HandlerMethod によって、実行されるメソッドのシグネチャなど、 追加情報を把握して、ロジックの実行の可否を判断できます。


フィルター (Filter) vs インターセプター (Interceptor)

  • フィルターはWebコンテキストで実行され、インターセプターはスプリングコンテキストで実行されるため、実行タイミングが異なります。
  • フィルターは、ディスパッチャーサーブレットの前後を処理できますが、インターセプターは、コントローラーの前後を処理できます。
  • フィルターは、スプリングに関係なく、グローバルに処理する必要がある作業を実行する場合や、入力として渡されたパラメータ自体を検証する場合や、 HttpServletRequest の代わりに ServletRequest を使用する場合は、フィルターを使用するのが適しています。
  • インターセプターは、スプリングに到達したクライアントのリクエストに関連して、グローバルに処理する必要がある場合や、サービスロジックを混在させる必要がある場合は、 インターセプターを使用するのが適しています。
  • インターセプターは、@ControllerAdvice と @ExceptionHandler を使用して、例外処理を行うことができますが、フィルターは、 これらを使用して例外処理を行うことはできません。
    • フィルターは、主に doFilter() メソッドの周囲を try~catch 文で囲むことで、その時点で発生した例外を すぐに処理します。


Argument Resolver

Argument Resolver とは?

Argument Resolver は、あるリクエストがコントローラーに渡されたときに、リクエストに含まれる値から、目的のオブジェクトを作成する作業を、 間接的に行うことができます。


Argument Resolver の用途

たとえば、JWTトークンとともにリクエストが渡されたとします。このトークンが有効なトークンであることを検証し、トークンに保存されている id を取得して、ログインユーザーオブジェクトを作成する必要があります。

このような場合、Argument Resolver を使用しないと、トークンを検証してログインユーザーオブジェクトに変換する処理を、すべてのコントローラーで 実装する必要があります。すると、ユーザーの検証が必要なコントローラーに重複コードが発生し、コントローラーの責任が増加します。このような 問題を Argument Resolver が解決できます。


Argument Resolver の実装

ArgumentResolver は、HandlerMethodArgumentResolver を実装することで使用できます。このインターフェースは、 以下の2つのメソッドを実装するように指定しています。


boolean supportsParameter(MethodParameter parameter);

@Nullable


  • supportsParameter メソッド
    • ArgumentResolver を実行させたい Parameter の前に、特定の注釈を作成して貼り付けます。 supportsParameter() メソッドは、リクエストされたメソッドの引数に目的の注釈が貼り付けられているかどうかを確認し、 目的の注釈が含まれている場合は、true を返します。
  • resolveArgument メソッド
    • supportsParameter で true を受け取った場合、つまり、特定の注釈が貼り付けられているメソッドがある場合、 parameter が目的の形式で情報をバインドして返します。


このように ArgumentResolver を使用すると、コントローラーの実装は次のようになります。


@GetMapping("/me")
public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
    MemberResponse memberResponse = memberService.findMember(loginMember.getId());
    return ResponseEntity.ok().body(memberResponse);


Argument Resolver とインターセプター (Interceptor) の違い

  • Argument Resolver は、インターセプターの後で動作し、あるリクエストがコントローラーに渡されたときに、リクエストに含まれる 値から目的のオブジェクトを返します。
  • 一方、インターセプターは、実際にコントローラーが実行される前にリクエストを傍受し、特定のオブジェクトを返却することはできません。 boolean または void の戻り値の型のみが存在します。


出典


予想される面接質問と回答

フィルターとは?

フィルターは、ディスパッチャーサーブレットにリクエストが渡される前後に、URLパターンに一致するすべてのリクエストに対して、 追加の処理を実行できる機能を提供し、サーブレットコンテナレベルで動作します。


フィルターを使用するタイミングは?

フィルターでは、スプリングに関係なく、グローバルに処理する必要がある作業を処理できます。または、リクエストパラメータを中心に検証する場合に 使用されます。

代表的な例としては、セキュリティ関連の共通作業、すべてのリクエストに対するロギング、画像/データの圧縮と文字列エンコーディング、 ServletRequest のカスタマイズ処理があります。


インターセプターとは?

インターセプターは、ディスパッチャーサーブレットがコントローラーを呼び出す前後に、リクエストとレスポンスを参照したり加工したりできる機能を提供し、 つまり、スプリングコンテナレベルで動作します。


インターセプターを使用するタイミングは?

インターセプターは、クライアントのリクエストに関連して、グローバルに処理する必要がある作業を処理でき、検証時にサービスロジックを呼び出す場合に 主に使用されます。

代表的な例としては、認証/認可などの共通作業、API呼び出しに関するロギング、コントローラーに渡すデータの加工処理があります。


フィルターとインターセプターの違いは?

フィルターはサーブレットコンテナレベルで実行され、インターセプターはスプリングコンテナレベルで実行されます。

フィルターは、ディスパッチャーサーブレットの前後を処理できますが、インターセプターは、コントローラーの前後を処理できます。

したがって、フィルターは、スプリングに関係なく、グローバルに処理する必要がある作業を実行するのに適しており、インターセプターは、 クライアントのリクエストに関連して、グローバルに処理する必要がある作業を実行するのに適しています。


Argument Resolver とは?

Argument Resolver は、あるリクエストがコントローラーに渡されたときに、リクエストに含まれる値から、目的のオブジェクトを作成する作業を、 間接的に行います。


Argument Resolver を使用するタイミングは?

JWTトークンとともにリクエストが渡されたときに、有効なトークンであることを検証し、トークンに保存されている id を取得して、 LoginMember というオブジェクトを作成する作業を行う場合に使用できます。


インターセプターと Argument Resolver の違いは?

Argument Resolver は、あるリクエストがコントローラーに渡されたときに、リクエストに含まれる値から目的のオブジェクトを返します。 一方、インターセプターは、このようにオブジェクトを返却することはできず、インターセプターが実行された後に Argument Resolver が実行されます。

제이온
제이온
제이온
제이온
[Spring] @Async の使用方法 Spring @Async を使用して Java 非同期処理を簡単に実装する方法について説明します。@Async アノテーションを使用することで、同期メソッドを非同期に変換し、スレッドプール設定で効率性を向上させることができます。Future、ListenableFuture、 CompletableFuture を活用して非同期処理結果を効果的に管理する方法についても説明しています。

2024年4月25日

[Effective Java] アイテム 1. 静的ファクトリメソッドをコンストラクタよりも優先する 静的ファクトリメソッドは、コンストラクタの代わりにインスタンスを作成する柔軟で効率的な方法です。 名前を付けることができ、特定の条件に合致するインスタンスを返したり、キャッシュを使ってパフォーマンスを向上させることができます。 シングルトンパターンとは異なり、複数のタイプのインスタンスを作成して返したり、リフレクションを使わずに柔軟性を維持することができます。

2024年4月27日

[Java] リフレクションの概念と使用方法 リフレクションは、Javaプログラムの実行時にクラス情報にアクセスしてクラスを操作できるようにするAPIです。実行時においてクラスを生成したり、フィールドやメソッドにアクセスできますが、カプセル化を損なったり、パフォーマンスを低下させる可能性があるため、慎重に使用する必要があります。Springフレームワークなど、実行時にオブジェクトを動的に生成して管理する必要がある場合に役立ちます。

2024年4月25日

[非専攻、開発者として生き残る] 14. 新卒開発者がよく聞かれる技術面接内容まとめ 新卒開発者向けの技術面接準備ガイドです。メインメモリ領域、データ構造、RDBMSとNoSQL、手続き型とオブジェクト指向、 オーバーライドとオーバーロード、ページ置換アルゴリズム、プロセスとスレッド、OSI 7層、TCPとUDPなど、面接でよく登場する概念を 説明します。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日

[Concurrency] Atomic Operation: メモリフェンスとメモリオーダリング このブログ投稿では、アトミック演算でのメモリの順序付けを考慮する方法と、Orderingオプションの重要性を説明します。Relaxed、 Acquire、Release、AcqRel、SecCstなど、さまざまなOrderingオプションの詳細と、各オプションの長所と短所、および使用 時の注意点について、例コードと共に詳しく説明します。
곽경직
곽경직
곽경직
곽경직
곽경직

2024年4月12日

[Javascript] オブジェクトの構造 (V8) JavaScriptのObjectは、V8エンジンでは、状態に応じて、構造体のように最適化されたFastモードと、ハッシュマップとして動作するDictionary モードに変換されます。Fastモードは、キーと値がほとんど固定された形式で高速ですが、新しいキーが追加されたり、要素を削除したりするなどの操作が行われた場合、 Dictionaryモードに切り替わり、速度が遅くなる可能性があります。
곽경직
곽경직
곽경직
곽경직
곽경직

2024年3月18日

顧客に会った。だからインタビューはどうだった? -1 顧客インタビューを通じて、企業の製品やサービスに対する真のフィードバックを得る方法についてのブログ投稿です。著者は、顧客インタビューは単なる質問と 回答ではなく、顧客との感情的な交流を通して真の意味を見出すプロセスであると強調し、顧客に対する態度と視点を変化させることが重要であると説明しています。
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

2024年4月26日

[php]UbuntuにCodeigniter 4をセットアップする Codeigniter 4開発サーバーのセットアップガイドです。Apache2、PHP 7バージョンをインストールした後、Codeigniter 4フレームワークファイルを ダウンロードしてプロジェクトファイルをアップロードします。権限設定、必須PHPエクステンションのインストール、php.iniファイルの修正後、Apache2を再起動すると Codeigniter 4の初期画面を確認できます。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年3月27日

[非専攻、開発者として生き残る] 17. 新卒開発者のポートフォリオ、どこまで? 新卒開発者のポートフォリオは、開発能力に集中することが重要です。 Infraまで実装するよりも、基本的なCRUD機能を完成させ、外部API 連携経験を積む方が効果的で、ネイバーログイン、ネイバーマップAPI、公共データポータルAPIなどを活用してみることができます。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日