[Spring Boot] Web 開発 - インターセプター

インターセプター

インターセプターは Web システムで非常に一般的であり、一般に、アクセス制御、ロギング、機密フィルタリングなどの機能を実装するためのユーザー要求をインターセプトするために使用されます。ここでは、実際のプロジェクトにおけるインターセプタの適用シナリオを紹介し、次にカスタムインターセプタの機能を実現する方法を紹介します。

1. 応用シナリオ

インターセプターは実際のアプリケーション開発では非常に一般的であり、一部のグローバルな統合操作についてはインターセプターに抽出できます。要約すると、インターセプターには通常、次のような使用シナリオがあります。

1) 権限チェック: ログイン検出など、ログインしているかどうかを確認するハンドラーを入力し、ログインしていない場合は直接ログイン ページに戻ります。

2) パフォーマンス監視: 一定期間、システムが不可解に遅くなることがありますが、インターセプタを介して処理プログラムに入る前の開始時間を記録し、処理後の終了時間を記録して、プログラムの処理時間を取得できます。リクエスト (Apache などのリバース プロキシがある場合は、自動的に記録できます)。

3) 一般的な動作: Cookie を読んでユーザー情報を取得し、後続のプロセスの使用を容易にするためにユーザー オブジェクトをリクエストに組み込み、複数のユーザーが必要とする限り、ロケール、テーマ情報などを抽出します。処理プログラムでは、インターセプタを使用して実装できます。

4) OpenSessionInView: Hibernate など、ハンドラーに入るときにセッション (セッション) を開き、完了後にセッションを閉じます。

2. HandlerInterceptor の概要

Spring Boot は、カスタム インターセプターの機能を実装するために HandlerInterceptor インターフェイスを定義します。HandlerInterceptorインターフェースには、preHandle、postHandle、afterCompletionの3つのメソッドが定義されており、これら3つのメソッドを書き換えることで、リクエスト前、リクエスト後などの動作を実現します。

1) preHandle: 前処理コールバック メソッドはハンドラーの前処理 (ログイン チェックなど) を実現します。3 番目のパラメーターは応答のハンドラーです。

戻り値: true はプロセスを続行することを意味します (次のインターセプターまたはハンドラーの呼び出しなど)、false はプロセスが中断されたことを意味します (ログイン チェックの失敗など)。応答は、 response を通じて生成される必要があります。

2) postHandle: ハンドラーの後処理を実装する後処理コールバック メソッド (ビューのレンダリング前) この時点で、モデル データまたはビューは、modelAndView (モデル オブジェクトとビュー オブジェクト) を通じて処理できます。 modelAndView が null の場合もあります。

3) afterCompletion: リクエスト全体が処理された後のコールバック メソッド、つまりビューがレンダリングされたときのコールバック たとえば、パフォーマンス監視では、ここで終了時刻を記録し、消費時間を出力したり、何らかのリソースを実行したりすることもできますクリーニングは、finally の try-catch-finally に似ていますが、ハンドラーを呼び出して preHandle を実行するだけで、true に対応するインターセプターの afterCompletion を返します。

場合によっては、3 つのコールバック メソッドのうち 1 つだけを実装する必要があります。HandlerInterceptor インターフェイスを実装する場合は、必要かどうかに関係なく、3 つのメソッドを実装する必要があります。現時点では、Spring は HandlerInterceptorAdapter アダプター (アダプター設計パターンの実装) を提供します。 )、必要なコールバック メソッドのみを実装できるようになります。

3. HandlerInterceptor を使用してインターセプターを実装する

注文詳細、注文リスト、表示するためにユーザーのログインが必要なその他の機能など、承認が必要な特定のページにアクセスする場合、これらのリクエストをインターセプトし、ログイン検出を実行し、ルールを満たすリクエストのみを許可する必要があります。次に、ログイン状態検出の例でインターセプターの使用を示します。

まず、カスタム ログイン インターセプターを作成します。サンプル コードは次のとおりです。

public class LoginInterceptor implements HandlerInterceptor {
    
    
    /*注册拦截器*/
    public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        Object user = request.getSession().getAttribute("user");
        if (user == null){
    
    
        request.setAttribute("msg","您没有权限这么做!");
        request.getRequestDispatcher("/").forward(request,response);
        	return false;
        }
        return true;
    }
}

上記の例では、LoginInterceptor は HandlerInterceptor インターフェイスを継承し、preHandle インターフェイスを実装し、ユーザーのセッション ステータスを確認します。現在のユーザーがログイン情報を持っている場合は、引き続きアクセスできますが、現在のユーザーがログイン情報を持っていない場合は、許可なしを返します。

次に、インターセプターをシステム構成に挿入します。

MyMvcConfig 構成クラスを定義し、上で定義した LoginInterceptor インターセプターをシステムに挿入します。サンプル コードは次のとおりです。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        registry.addInterceptor(new LoginInterceptor())
        .addPathPatterns("/**").excludePathPatterns("/", "/user/login", "/asserts/**", "/webjars/**");
    }
}

WebMvcConfigurer クラスの addInterceptors メソッドを通じて、新しくカスタマイズされた LoginInterceptor インターセプターをシステムに挿入します。

addPathPatterns は、インターセプトされたリクエストのアドレスを定義します。

excludePathPatterns の機能は、特定のアドレスをブロックから除外することです。たとえば、ログイン アドレス /user/login はログイン検証を必要としません。

おすすめ

転載: blog.csdn.net/weixin_45627039/article/details/131909776