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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...