攔截器一二三

来源:https://www.cnblogs.com/zero-2020/archive/2022/11/08/16871065.html
-Advertisement-
Play Games

1.實現攔截器 1.寫一個攔截器 繼承HandlerInterceptor preHandle: 調用時間: Controller方法處理之前【也就是路徑跳轉之前】; 執行順序: 鏈式Intercepter情況下,Intercepter按照聲明的順序一個接一個執行; 返回值: 返回值為true,則繼 ...


1.實現攔截器

1.寫一個攔截器

繼承HandlerInterceptor

preHandle:

  • 調用時間: Controller方法處理之前【也就是路徑跳轉之前】;

  • 執行順序: 鏈式Intercepter情況下,Intercepter按照聲明的順序一個接一個執行;

  • 返回值: 返回值為true,則繼續執行,false中斷執行,生成時預設false;

  • 應用場景:登陸驗證之類的

postHandle:

  • 調用前提: preHandle返回true;

  • 調用時間: Controller方法處理完之後,DispatcherServlet進行視圖的渲染之前,也就是說在這個方法中你可以對ModelAndView進行操作

  • 執行順序: 鏈式Intercepter情況下,Intercepter按照聲明的順序倒著執行。

  • 備註: postHandle雖然post打頭,但post、get方法都能處理

afterCompletion:

  • 調用前提:preHandle返回true

  • 調用時間:DispatcherServlet進行視圖的渲染之後

  • 應用場景:多用於清理資源,統一日誌處理,統一異常處理

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲取session
        HttpSession session = request.getSession();
        //獲取session中的用戶
        UserDTO user = (UserDTO) session.getAttribute("user");
        //判斷用戶是否存在
        if(user == null){
            //不存在並;攔截
            response.setStatus(401);
            return false;
        }
        //存在,保存用戶到TheadLocal放行
        UserHolder.saveUser(user);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserHolder.removeUser();
    }
}

2.開啟攔截器

WebMvcConfigurer

order:決定攔截器執行的順序

初始值都為0,不設置按照添加順序執行

添加後,最先執行的是order(0)

@Configuration
public class MVCConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new LoginInterceptor())
               .excludePathPatterns("/user/code",
                       "/user/login",
                       "/shop/**",
                       "/upload/**",
                       "/shop-type/**",
                       "/shop/**",
                       "/blog/hot",
                       "/voucher/**",
                       "/user/me"
               ).order(1);}
}

2.攔截器類型(有待考證)

HandlerInterceptor類: 三個方法都必須繼承

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
}

多個攔截器的執行順序:

img img

HandlerInterceptorAdapter類:可以選擇性繼承三個方法中的一個

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {  
     //選擇需要的方法 
}  

3.攔截器和spring容器的先後執行順序

img

4.過濾器和攔截器的區別

原文鏈接:https://blog.csdn.net/nigulasizp/article/details/125322507

1、實現原理不同 過濾器和攔截器底層實現方式大不相同,過濾器 是基於函數回調的,攔截器 則是基於Java的反射機制(動態代理)實現的。

2、使用範圍不同 我們看到過濾器 實現的是 javax.servlet.Filter 介面,而這個介面是在Servlet規範中定義的,也就是說過濾器Filter 的使用要依賴於Tomcat等容器,導致它只能在web程式中使用。 而攔截器(Interceptor) 它是一個Spring組件,並由Spring容器管理,並不依賴Tomcat等容器,是可以單獨使用的。不僅能應用在web程式中,也可以用於Application、Swing等程式中。

3、觸發時機不同 過濾器Filter是在請求進入容器後,但在進入servlet之前進行預處理,請求結束是在servlet處理完以後。攔截器 Interceptor 是在請求進入servlet後,在進入Controller之前進行預處理的,Controller 中渲染了對應的視圖之後請求結束。

4、攔截的請求範圍不同 過濾器Filter執行了兩次,攔截器Interceptor只執行了一次。這是因為過濾器幾乎可以對所有進入容器的請求起作用,而攔截器只會對Controller中請求或訪問static目錄下的資源請求起作用。

5、註入Bean情況不同 這是因為載入順序導致的問題,攔截器載入的時間點在springcontext之前,而Bean又是由spring進行管理。(所以攔截器中註入不了Bean)

6、控制執行順序不同 過濾器用@Order註解控制執行順序,通過@Order控制過濾器的級別,值越小級別越高越先執行。 攔截器預設的執行順序,就是它的註冊順序,也可以通過Order手動設置控制,值越小越先執行

Filter的執行順序在Interceptor之前,具體的流程見下圖
image-20221108195620102

5.攔截器的原理

攔截器Interceptor 的攔截功能是基於Java的反射機制(動態代理)實現的。

原文地址:http://hzhcontrols.com/new-1239027.html


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

-Advertisement-
Play Games
更多相關文章
  • 1、表單語法 method: 規定如何發送表單數據常用值:get post 在實際網頁開發中通常採用post方式提交表單數據 action: 表示向何處發送表單數據 <form method="post" action="result.html"> <p>名字:<input name="name" ...
  • 1、列表 無序列表和定義列表在網頁製作中應用非常廣泛 什麼是列表: 列表就是信息資源的一種展示形式。它可以使信息結構化和條理化,並以列表的樣式顯示出來,以便瀏覽者能更快捷地獲得相應的信息。 無序列表 <!--ul 聲明無序列表--> <ul> <!--li 聲明列表項--> <li>語文</li> ...
  • 面向對象之魔法方法 一、魔法方法的概念 ​ 定義在類中的雙下方法都可以稱為魔法方法 ​ 不需要人為調用,在特定的條件下會自動觸發,並運行 ​ 類似於__ init__, 當我在使用類產生對象時,會自動觸發 class Foo: # 雙下init就是魔法方法的一種 def __init__(self, ...
  • 職責鏈模式是一種與策略模式類似的設計模式,都是使用多個對象去處理同一個請求。不同的是,職責鏈模式針對的一條鏈路上的所有對象,而不是“非此即彼”的關係。 ...
  • 派生方法實戰 ​ 以上我們學習了通過super()的方法可以重寫父類、額外添加父類中的數據,下麵將通過實戰案例來講述super()方法來重寫、添加父類中的功能代碼 需求: 1、使用json格式,序列化字典d d = { 't1': datetime.date.today(), 't2': datet ...
  • 簡介: 代理模式,是結構型的設計模式。用於為其它對象提供一種代理以控制對這個對象的訪問。 目標對象可以是遠程的對象、創建開銷大的對象或需要安全控制的對象,並且可以在不改變目標對象的情況下添加一些額外的功能。 適用場景: 調用端不想或不能直接調用的對象。 服務端不想讓調用端看到核心實現。 優點: 服務 ...
  • 前言 大家早好、午好、晚好吖~ 最近,又爆出了許多例,身在長沙得我前段時間不是在做核酸就是在做核酸得路上 雖然現在還是隔一天一捅(小聲嗶嗶:我真的遭不住)希望疫情早日過去 疫情尚未結束,我們需要做好自己,時刻防範,不給別人添麻煩。 今天我們來嘗試用Python抓取世界疫情,實現可視化地圖展示。 採集 ...
  • Servlet03 11.練習 快捷鍵-可以快速地在訪問的文件件切換 ctrl+alt+向左箭頭:回到上次訪問的位置 ctrl+alt+向右箭頭:回到下一步訪問的位置 11.1CatServlet 首先創建項目servlet,配置好Tomcat,添加web應用支持。在web目錄下麵的WEB-INF目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...