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のログイン機能を実装します。
ログイン機能を実現
- 次の図に示すように、AdminEx テンプレートの index.html の名前を main.html に変更し、src/main/resources/templates に移動します。
図 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"; }*/ }
-
構成クラス 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 ("メイン"); } ... }
-
次のコードを login.html の適切な場所に追加して、エラー メッセージを表示します。
ログイン傍受
図 1: ログインが傍受される
- ログインページのユーザー名とパスワードの入力ボックスにそれぞれ「admin」と「admin123」と入力し、下のログインボタンをクリックすると、下図のようになります。
ログインに失敗しました
図 2: ログインに失敗しました
- ログインページのユーザー名とパスワードの入力ボックスにそれぞれ「admin」と「123456」を入力し、下のログインボタンをクリックすると、下図のようになります。
着陸成功