12、SpringMVC之攔截器

来源:https://www.cnblogs.com/Javaer1995/archive/2023/11/10/17811857.html
-Advertisement-
Play Games

12.1、環境搭建 創建名為spring_mvc_interceptor的新module,過程參考9.1節和9.5節 12.1.1、頁面請求示例 <a th:href="@{/test/hello}">測試攔截器</a> 12.1.2、控制器方法示例 @RequestMapping("/test/h ...


12.1、環境搭建

創建名為spring_mvc_interceptor的新module,過程參考9.1節和9.5節

12.1.1、頁面請求示例

image

<a th:href="@{/test/hello}">測試攔截器</a>

12.1.2、控制器方法示例

image

    @RequestMapping("/test/hello")
    public String testHello(){
        return "success";
    }

12.2、攔截器的入門示例

12.2.1、創建攔截器

image

package online.liaojy.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author liaojy
 * @date 2023/11/7 - 20:57
 */
// SpringMVC 中的攔截器要實現 HandlerInterceptor 介面
public class AAAInterceptor implements HandlerInterceptor {

    // preHandle()方法在控制器方法執行之前執行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AAAInterceptor-->preHandle()");

        // 返回true表示不攔截,即執行控制器方法
        // 返回false表示攔截,即不再執行控制器方法
        return true;
    }

    // postHandle()方法在控制器方法執行之後執行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("AAAInterceptor-->postHandle()");
    }

    // afterCompletion()方法在渲染完視圖之後執行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("AAAInterceptor-->afterCompletion()");
    }

}

12.2.2、配置攔截器

與自定義的過濾器一樣,自定義的攔截器也要配置後才能生效;

過濾器是伺服器中的組件,所以配置到 web.xml 中;

攔截器是 springmvc 中的組件,因此要配置到 springmvc 的配置文件中。

image

    <mvc:interceptors>
        <bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
    </mvc:interceptors>

12.2.3、測試效果

image

image

因為在配置攔截器時,沒有指定要攔截的路徑,所以訪問任何DispatcherServlet處理的資源時,攔截器都會執行。

image

image

image

12.3、攔截器的註解配置

除了使用 bean 標簽通過全限定類名來配置攔截器,還可以通過 ref 標簽引用已存在的 bean 組件來配置攔截器

12.3.1、將攔截器標識為bean組件

image

因為攔截器不屬於持久層、業務層和控制層,所以應該用 @Component 註解將其標識為一個 bean 組件

@Component

12.3.2、通過ref標簽引用配置攔截器

image

    <mvc:interceptors>
        <ref bean="AAAInterceptor"></ref>
    </mvc:interceptors>

12.4、攔截器的進階示例

通過上述的方式來配置攔截器,會對 DispatcherServlet 所處理的所有請求都進行攔截;

在實際情況中,可能只需要攔截部分請求,或排除部分請求的攔截。

12.4.1、精確的攔截配置

image

    <mvc:interceptors>
        <mvc:interceptor>
            <!--通過mvc:mapping設置要攔截的請求,可以設置多個;用通配符時,/*表示只攔截一級路徑的,/**才表示攔截任意的-->
            <mvc:mapping path="/**"/>
            <!--通過mvc:exclude-mapping設置要排除攔截的請求,可以設置多個 -->
            <mvc:exclude-mapping path="/abc"/>
            <!--設置實行精確攔截規則的攔截器-->
            <bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

12.4.2、測試效果

image

image

如上圖所示,攔截了一級路徑的請求

image

image

image

如上圖所示,攔截了二級路徑的請求

image

image

如上圖所示,沒有攔截/abc的請求

註意:為實現演示效果,本例已在springmvc配置文件中設置了關於/abc請求的視圖控制器

<mvc:view-controller path="/abc" view-name="success"></mvc:view-controller>

12.5、多個攔截器的執行順序

12.5.1、創建另一個攔截器

image

package online.liaojy.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author liaojy
 * @date 2023/11/9 - 7:27
 */
public class BBBInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("BBBInterceptor-->preHandle()");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("BBBInterceptor-->postHandle()");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("BBBInterceptor-->afterCompletion()");
    }
}

12.5.2、配置多個攔截器

image

    <mvc:interceptors>
        <bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
        <bean class="online.liaojy.interceptor.BBBInterceptor"></bean>
    </mvc:interceptors>

12.5.3、情況一

  • 如果每個攔截器的preHandle()都返回true

  • 此時多個攔截器的執行順序和攔截器在SpringMVC的配置文件的配置順序有關

  • preHandle()會按照配置的順序執行,而postHandle()和afterCompletion()會按照配置的反序執行

image

image

註意:此時 AAAInterceptor 和 BBBInterceptor 攔截器的 preHandle() 方法返回值都是 true

12.5.4、情況二

  • 如果某個攔截器的preHandle()返回了false

  • 返回false的攔截器和它之前的攔截器的preHandle()都會執行

  • 所有postHandle()都不執行

  • 返回false的攔截器之前的攔截器的afterCompletion()會執行

image

image

註意:此時 AAAInterceptor 攔截器的 preHandle() 方法返回值為true,而 BBBInterceptor 攔截器的為 false

12.5.5、執行順序流程圖

image

12.6、相關拓展

12.6.1、攔截器與過濾器的區別

  • 過濾器是 Tomcat 伺服器中的對象,攔截器是 SpringMVC 框架中的對象;

  • 過濾器實現的是 Java 中的 Filter 介面,攔截器實現的是 SpringMVC 中的 HandleInterceptor 介面;

  • 過濾器配置在 web.xml 中,攔截器配置在 SpringMVC 配置文件中;

  • 過濾器在攔截器之前執行;

  • 過濾器是一個執行時間點;攔截器是三個執行時間點;

  • 過濾器除了對動態資源進行過濾之外,還可以對靜態資源(HTML、CSS、JS、圖片等)進行過濾;

  • 攔截器側重對控制器方法進行攔截處理,如果一個請求不能被DispatcherServlet接收,那這個請求也不會被攔截器處理。

12.6.2、攔截器的應用場景

  • 許可權校驗:用戶在訪問某資源時,可以使用攔截器對用戶請求進行攔截,
    判斷當前用戶有沒有登錄,如果沒有登錄則強制回到登錄頁面進行登錄。

  • 性能監控:如果想統計用戶訪問某個控制器方法的時間,可以使用攔截器對控制器方法進行前置攔截和後置攔截,
    在前置攔截器裡面記錄用戶訪問資源的起始時間,在後置攔截器裡面記錄用戶訪問資源的結束時間,
    兩個時間之差就是當前用戶訪問控制器方法是總時長。

  • 日誌記錄:記錄請求資源的日誌信息,比如請求方式、請求參數、請求響應等,都可以通過攔截器來實現信息記錄。

本文來自博客園,作者:Javaer1995,轉載請註明原文鏈接:https://www.cnblogs.com/Javaer1995/p/17811857.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:WangMin 格言:努力做好自己喜歡的每一件事 對於初學CSS的同學來說,會有很多屬性相關的疑問,行高屬性 line-height一定是其中一個,因為它是CSS中非常重要的一個屬性,這個屬性改變元素在網頁中的行高,讓你的網頁看起來更加整潔,美觀。 什麼是行高? CSS中的行高(line-he ...
  • 我們可以採取多種方法對數據架構進行分類,且每種方法都有自己的優缺點。它們可以幫助你做出明智的決定,選擇適合與你需求最匹配的設計。兩種最流行的基於速度的架構是Lambda和Kappa,本文將介紹基於速度的數據架構,以及它們在總體方案中的位置。 ...
  • 從接觸領域驅動設計的初學階段,到實現一個舊系統改造到DDD模型,再到按DDD規範落地的3個的項目。對於領域驅動模型設計研發,從開始的各種疑惑到吸收各種先進的理念,目前在技術實施這一塊已經基本比較成熟。在既往經驗中總結了一些在開發中遇到的技術問題和解決方案進行分享。 ...
  • 原文鏈接: https://bysocket.com/openai-gpt4-plus-account-subscribe/ 瞭解如何購買和使用共用 GPT-4 賬號。通過OpenAI共用會員獲取GPT-4 賬號拼車服務。購買方式包括官方網站、第三方授權商、POE平臺和NewBing平臺。 一、GP ...
  • 三、基本數據類型和計算(二) 1、字元 #include <iostream> int main() { std::cout << 65 << std::endl; //65是一個int類型的整數 std::cout << (char)65 << std::endl; //將其轉化為1個位元組的cha ...
  • 一、QBarSeries簡介 1. 官方描述 https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QBarSeries.html 【譯註:官方文檔內容過於簡潔,表明完全僅繼承了QAbstractBarSeries,且沒有擴展任何屬性、方法和信號。因此,直 ...
  • 刷 Leetcode 總能遇到關於二分的題目,但是之前也只是草草地瞭解一下,每次在使用的時候都需要找模板,要不然就需要對於邊界條件進行調試,著實是很麻煩!!! 二分介紹: 首先來簡單介紹一下二分:二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求 線性 ...
  • 從表格中選擇數據 要從MySQL中的表格中選擇數據,請使用"SELECT"語句: 示例選擇"customers"表格中的所有記錄,並顯示結果: import mysql.connector mydb = mysql.connector.connect( host="localhost", user= ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...