インターセプター
インターセプターは 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 はログイン検証を必要としません。