Spring Boot インターセプターの本質

Struts 2 と Spring MVC はどちらも、URL に基づいてリクエストをインターセプトできるインターセプター機能を提供しており、主にログイン検証、権限検証、文字化けコードの解決、パフォーマンス監視、例外処理などの機能で使用されます。Spring Boot は、インターセプター機能も提供します。

Spring Boot プロジェクトでインターセプター関数を使用するには、通常、次の 3 つの手順が必要です:
インターセプターの定義、
インターセプターの登録、
インターセプト ルールの指定 (すべてがインターセプトされる場合、静的リソースもインターセプトされます)。
インターセプターの定義
Spring Boot でインターセプターを定義するのは非常に簡単です。インターセプター クラスを作成し、HandlerInterceptor インターフェースを実装するだけです。

次の表に示すように、次の 3 つのメソッドが HandlerInterceptor インターフェースで定義されています。
ここに画像の説明を挿入
例 1
spring-boot-adminex プロジェクトを例として、net.biancheng.www.componet に LoginInterceptor という名前のインターセプター クラスを作成して、ログインをインターセプトします。コードは次のとおりです。
パッケージ net.biancheng.www.componet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class LoginInterceptor implements HandlerInterceptor { /** * 対象メソッド実行前* * @param request * @param response * @param handler * @return * @throws Exception /









@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object loginUser = request.getSession().getAttribute(“loginUser”); if (loginUser == null) { //ログインしていない場合は、に戻るログインページrequest.setAttribute("msg", "この操作を実行する権限がありません。最初にログインしてください!"); request.getRequestDispatcher("/index.html").forward(request, response); return false ; } else { // Release return true; } } /











*
* 対象メソッド実行後
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("postHandle execute {}", modelAndView); } /


*
* ページがレンダリングされた後
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("afterCompletion execution exception {}", ex) ; } }インターセプターを登録する




WebMvcConfigurer インターフェイス (@Configuration でアノテーションが付けられたクラス) を実装する構成クラスを作成し、addInterceptors() メソッドをオーバーライドし、このメソッドで registry.addInterceptor() メソッドを呼び出して、コンテナーにカスタム インターセプターを登録します。
例 2
構成クラス MyMvcConfig で、次のメソッドを追加してインターセプターを登録します。コードは次のようになります。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()); } }インターセプト ルールを指定する MyMvcConfig 構成クラスの addInterceptors() メソッドのコードを変更し、引き続きインターセプターを指定する インターセプトのルール、コードは次のとおりです。@Slf4j @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) {














log.info("Registration Interceptor");
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/ ") //静的リソース files.excludePathPatterns
("/", "/login", " / index.html", "/user/login", "/css/
", "/images/ ", "/js/ ", "/fonts/**"); //ログインページ、ログイン操作、静的リソースの解放
}
}

インターセプター インターセプト ルールを指定する場合、2 つのメソッドが呼び出されます. これら 2 つのメソッドの説明は次のとおりです
.静的リソース リクエストを含むすべてのリクエスト。
excludePathPatterns: このメソッドは、インターセプト パスを除外するために使用されます。つまり、インターセプターによってインターセプトされる必要のない要求を指定します。

ここまででインターセプターの基本機能は完成したので、まずは認証ログインインターセプトの準備としてspring-boot-adminexのログイン機能を実装します。

ログイン機能を実現

  1. 次の図に示すように、AdminEx テンプレートの index.html の名前を main.html に変更し、src/main/resources/templates に移動します。

ここに画像の説明を挿入

図 1: メイン ページ

  1. tangyu9880.controller に LoginController を作成し、ログイン要求を処理するメソッド doLogin() を追加します。コードは次のとおりです。
    パッケージ tangyu9880.controller;
    import lombok.extern.slf4j.Slf4j;
    import tangyu9880.bean.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation. GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpSession;
    import java.util.Map;
    @Slf4j
    @Controller
    パブリック クラスLoginController { @RequestMapping("/user/login")

    public String doLogin(User user, Map<String, Object> map, HttpSession session) { if (user != null && StringUtils.hasText(user.getUsername()) && “123456”.equals(user.getPassword())) { session.setAttribute("loginUser", user); log.info("Successful login, username:" + user.getUsername()); //リダイレクトを使用して送信の繰り返しを防止するreturn "redirect:/main.html"; } else { map.put("msg", "ユーザー名またはパスワードが正しくありません"); log.error("ログインに失敗しました"); return "ログイン"; } } /* @RequestMapping("/main.html") public String mainPage( ){ return "main"; }*/ }
















  2. 構成クラス MyMvcConfig にビュー マッピングを追加します。コードは次のとおりです。
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { //"/" または "/index.html" にアクセスすると、ログイン ページへ直接ジャンプしますregistry.addViewController("/"). setViewName( "login"); registry.addViewController("/index.html").setViewName("login"); //dashboard.html を指すビュー マッピング main.html を追加するregistry.addViewController(“/main.html”). setViewName ("メイン"); } ... }









  3. 次のコードを login.html の適切な場所に追加して、エラー メッセージを表示します。

ログインとログイン傍受機能の検証 1.Spring Boot を起動し、ログインせずに「http://localhost:8080/main.html」からホームページに直接アクセスすると、下図のようになります。![ここに写真の説明を挿入](https://img-blog.csdnimg.cn/676e3a413b6b485faf2439d79e5fcac3.png)

ログイン傍受
図 1: ログインが傍受される

  1. ログインページのユーザー名とパスワードの入力ボックスにそれぞれ「admin」と「admin123」と入力し、下のログインボタンをクリックすると、下図のようになります。
    ここに画像の説明を挿入

ログインに失敗しました
図 2: ログインに失敗しました

  1. ログインページのユーザー名とパスワードの入力ボックスにそれぞれ「admin」と「123456」を入力し、下のログインボタンをクリックすると、下図のようになります。
    ここに画像の説明を挿入

着陸成功

おすすめ

転載: blog.csdn.net/weixin_64842782/article/details/125106848