最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot攔截器的配置使用介紹

 更新時(shí)間:2022年10月21日 10:33:19   作者:劉婉晴  
攔截器可以用來實(shí)現(xiàn)未滿足某些條件,不容許訪問某些資源。SpringBoot 支持?jǐn)r截器,本文主要介紹攔截器的使用與原理

1. 配置攔截器

具體步驟:

編寫一自定義攔截器類實(shí)現(xiàn)接口 HandlerInterceptor

HandlerInterceptor 接口: 可在三處進(jìn)行攔截——目標(biāo)方法執(zhí)行之前、目標(biāo)方法執(zhí)行完成、頁面渲染以后攔截

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

將攔截器注冊(cè)到容器中,實(shí)現(xiàn) WebMvcConfigurer 中的 addInteraptor,然后將自定義攔截器注冊(cè)到攔截器中

指定攔截器規(guī)則 —— 攔截所有 '/**' ,靜態(tài)資源也會(huì)被攔截

解決靜態(tài)資源同時(shí)被攔截問題:

  • addPathPatterns中精確指定精確需要攔截資源
  • excludePathPatterns 中指定排除靜態(tài)資源

可在 application.properties 文件中指定靜態(tài)資源統(tǒng)一前綴,方便排除靜態(tài)資源

spring.mvc.static-path-pattern=/static/**

2. 一個(gè)小 Demo

實(shí)現(xiàn)未登錄用戶不能訪問除登錄頁外其他頁面的小Demo

1. 自定義攔截器類—LoginInterceptor

自定義登錄攔截器,實(shí)現(xiàn)檢測(cè)到用戶未登錄,則攔截用戶對(duì)其他資源的訪問,并返回到登錄頁面

package com.wanqing.admin.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.Session;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
登錄檢查
 */
@Slf4j // lombok 提供的功能
public class LoginInterceptor implements HandlerInterceptor {
    // 目標(biāo)方法執(zhí)行之前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       log.info("攔截的路徑是{}", request.getRequestURI());
        // 登錄檢查邏輯
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser != null){
            return true; // 放行
        }
        // 攔截住,重定向到登錄頁面
        request.setAttribute("msg", "未登錄不允許訪問");
        request.getRequestDispatcher("/").forward(request, response); // 轉(zhuǎn)發(fā)到當(dāng)前請(qǐng)求
        return false;
    }
    // 目標(biāo)方法執(zhí)行之后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    // 頁面渲染完成之后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

2. 將攔截器注冊(cè)到容器中

通過下列方法,將攔截器注冊(cè)到容器中,并配置好要攔截的路徑和要放行的路徑。本次 demo 中若未登錄則所有路徑都攔截,只放行登錄頁面

package com.wanqing.admin.config;
import com.wanqing.admin.interceptor.LoginInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 在攔截器的注冊(cè)中心里,添加 Login 攔截器
        registry.addInterceptor(new LoginInterceptor())
                    .addPathPatterns("/**") //所有請(qǐng)求都被攔截,靜態(tài)資源也被攔截
                    .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); // 放行的請(qǐng)求
    }
}

3. 原理分析

1. 根據(jù)當(dāng)前請(qǐng)求,找到HandlerExecutionChainand,即得到可以處理請(qǐng)求的 Handler,以及 Handler 的所有攔截器

處理器執(zhí)行鏈 :

2. 先順序執(zhí)行所有攔截器的preHandle方法

  • 如果返回為true執(zhí)行下一個(gè)攔截器的preHandle;
  • 若為 false,直接倒敘執(zhí)行所有已經(jīng)執(zhí)行了的攔截器的 afterCompletion 方法

Step into:

 if (!mappedHandler.applyPreHandle(processedRequest, response)) {
     return;
 }

攔截器方法執(zhí)行 源碼分析:

HandlerExecutionChain.class

—— 順序執(zhí)行所有攔截器的preHandle方法

 for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex = i++) {
     HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
     if (!interceptor.preHandle(request, response, this.handler)) {
         this.triggerAfterCompletion(request, response, (Exception)null);
         return false;
     }
 }

—— 倒敘執(zhí)行所有已經(jīng)執(zhí)行了的攔截器的 afterCompletion 方法

    void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) {
        for(int i = this.interceptorIndex; i >= 0; --i) {
            HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
            try {
                interceptor.afterCompletion(request, response, this.handler, ex);
            } catch (Throwable var7) {
                logger.error("HandlerInterceptor.afterCompletion threw exception", var7);
            }
        }
    }

3. 如果任何一個(gè)攔截器返回 false,直接跳出不執(zhí)行目標(biāo)方法

4. 所有攔截器都返回 true,執(zhí)行目標(biāo)方法

5. 目標(biāo)方法執(zhí)行后,倒敘執(zhí)行所有攔截器的 postHandle 方法

6. 前面的步驟有任何異常都會(huì)直接觸發(fā) afterCompletion 方法

7. 頁面成果渲染完成之后,也會(huì)倒敘觸發(fā) afterCompletion 方法

圖解:

到此這篇關(guān)于SpringBoot攔截器的配置使用介紹的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹

    Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹,本文講解了為什么要使用代理模式、如何使用代理模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • JAVA序列化Serializable及Externalizable區(qū)別詳解

    JAVA序列化Serializable及Externalizable區(qū)別詳解

    這篇文章主要介紹了JAVA序列化Serializable及Externalizable區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解SpringBoot迭代發(fā)布JAR瘦身配置

    詳解SpringBoot迭代發(fā)布JAR瘦身配置

    這篇文章主要介紹了詳解SpringBoot迭代發(fā)布JAR瘦身配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java jar打包工具使用方法步驟解析

    Java jar打包工具使用方法步驟解析

    這篇文章主要介紹了Java jar打包工具使用方法步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 創(chuàng)建java多線程程序

    創(chuàng)建java多線程程序

    Java 給多線程編程提供了內(nèi)置的支持。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。希望本篇文章能夠給你帶來幫助
    2021-06-06
  • java 實(shí)現(xiàn)局域網(wǎng)文件傳輸?shù)膶?shí)例

    java 實(shí)現(xiàn)局域網(wǎng)文件傳輸?shù)膶?shí)例

    這篇文章主要介紹了java 實(shí)現(xiàn)局域網(wǎng)文件傳輸?shù)膶?shí)例的相關(guān)資料,這里提供了實(shí)現(xiàn)代碼可以幫助大家理解TCP及文件讀寫的知識(shí),需要的朋友可以參考下
    2017-07-07
  • MyBatis 如何配置多個(gè)別名 typeAliasesPackage

    MyBatis 如何配置多個(gè)別名 typeAliasesPackage

    這篇文章主要介紹了MyBatis 如何配置多個(gè)別名 typeAliasesPackage,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 一分鐘掌握J(rèn)ava?ElasticJob分布式定時(shí)任務(wù)

    一分鐘掌握J(rèn)ava?ElasticJob分布式定時(shí)任務(wù)

    ElasticJob?是面向互聯(lián)網(wǎng)生態(tài)和海量任務(wù)的分布式調(diào)度解決方案,本文主要通過簡(jiǎn)單的示例帶大家深入了解ElasticJob分布式定時(shí)任務(wù)的相關(guān)知識(shí),需要的可以參考一下
    2023-05-05
  • 詳解java中保持compareTo和equals同步

    詳解java中保持compareTo和equals同步

    這篇文章主要介紹了詳解java中保持compareTo和equals同步的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring中@RefreshScope注解的處理方法詳解

    Spring中@RefreshScope注解的處理方法詳解

    這篇文章主要介紹了Spring中@RefreshScope注解的處理方法詳解,spring啟動(dòng)時(shí)會(huì)調(diào)用ClassPathBeanDefinitionScanner.java類中的doScan()對(duì)包路徑下的所有class進(jìn)行掃描,獲取bean的定義,同時(shí)對(duì)bean的@RefreshScope(@Scope的父類)進(jìn)行處理,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

永吉县| 彭水| 镶黄旗| 鹤峰县| 山丹县| 泗洪县| 莱西市| 五指山市| 巴东县| 邯郸县| 普兰县| 田阳县| 大丰市| 贺州市| 阜阳市| 新昌县| 中超| 洪泽县| 阜城县| 青阳县| 昌邑市| 金川县| 保定市| 永吉县| 琼结县| 若尔盖县| 高陵县| 嘉鱼县| 牙克石市| 新安县| 黄梅县| 安溪县| 华亭县| 玉树县| 娄烦县| 广德县| 南昌县| 游戏| 松阳县| 定南县| 景谷|