欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC攔截器快速掌握下篇

 更新時(shí)間:2022年08月19日 11:44:05   作者:十八歲討厭編程  
攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器的概念及入門(mén)案例,感興趣的可以嘗試一下

攔截器參數(shù)

前置處理方法

原始方法之前運(yùn)行preHandle

public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}
  • request:請(qǐng)求對(duì)象
  • response:響應(yīng)對(duì)象
  • handler:被調(diào)用的處理器對(duì)象,本質(zhì)上是一個(gè)方法對(duì)象,對(duì)反射中的Method對(duì)象進(jìn)行了再包裝

使用request對(duì)象可以獲取請(qǐng)求數(shù)據(jù)中的內(nèi)容,如獲取請(qǐng)求頭的Content-Type

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String contentType = request.getHeader("Content-Type");
    System.out.println("preHandle..."+contentType);
    return true;
}

使用handler參數(shù),可以獲取方法的相關(guān)信息

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    HandlerMethod hm = (HandlerMethod)handler;
    String methodName = hm.getMethod().getName();//可以獲取方法的名稱(chēng)
    System.out.println("preHandle..."+methodName);
    return true;
}

后置處理方法

原始方法運(yùn)行后運(yùn)行,如果原始方法被攔截,則不執(zhí)行

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

前三個(gè)參數(shù)和上面的是一致的。

modelAndView:如果處理器執(zhí)行完成具有返回結(jié)果,可以讀取到對(duì)應(yīng)數(shù)據(jù)與頁(yè)面信息,并進(jìn)行調(diào)整

因?yàn)樵蹅儸F(xiàn)在都是返回json數(shù)據(jù),所以該參數(shù)的使用率不高。

完成處理方法

攔截器最后執(zhí)行的方法,無(wú)論原始方法是否執(zhí)行

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

前三個(gè)參數(shù)與上面的是一致的。

ex:如果處理器執(zhí)行過(guò)程中出現(xiàn)異常對(duì)象,可以針對(duì)異常情況進(jìn)行單獨(dú)處理

因?yàn)槲覀儸F(xiàn)在已經(jīng)有全局異常處理器類(lèi),所以該參數(shù)的使用率也不高。

這三個(gè)方法中,最常用的是preHandle,在這個(gè)方法中可以通過(guò)返回值來(lái)決定是否要進(jìn)行放行,我們可以把業(yè)務(wù)邏輯放在該方法中,如果滿(mǎn)足業(yè)務(wù)則返回true放行,不滿(mǎn)足則返回false攔截。

攔截器鏈配置

目前,我們?cè)陧?xiàng)目中只添加了一個(gè)攔截器,如果有多個(gè),該如何配置?配置多個(gè)后,執(zhí)行順序是什么?

配置多個(gè)攔截器

創(chuàng)建攔截器類(lèi)

實(shí)現(xiàn)接口,并重寫(xiě)接口中的方法

@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...222");
        return false;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...222");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...222");
    }
}

配置攔截器類(lèi)

@Configuration
@ComponentScan({"com.nefu.controller"})
@EnableWebMvc
//實(shí)現(xiàn)WebMvcConfigurer接口可以簡(jiǎn)化開(kāi)發(fā),但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置多攔截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
    }
}

然后我們運(yùn)行程序,觀察順序:

攔截器執(zhí)行的順序是和配置順序有關(guān)。就和前面所提到的運(yùn)維人員進(jìn)入機(jī)房的案例,先進(jìn)后出。

  • 當(dāng)配置多個(gè)攔截器時(shí),形成攔截器鏈
  • 攔截器鏈的運(yùn)行順序參照攔截器添加順序?yàn)闇?zhǔn)
  • 當(dāng)攔截器中出現(xiàn)對(duì)原始處理器的攔截,后面的攔截器均終止運(yùn)行
  • 當(dāng)攔截器運(yùn)行中斷,僅運(yùn)行配置在前面的攔截器的afterCompletion操作

preHandle:與配置順序相同,必定運(yùn)行

postHandle:與配置順序相反,可能不運(yùn)行

afterCompletion:與配置順序相反,可能不運(yùn)行。

這個(gè)順序不太好記,最終只需要把握住一個(gè)原則即可:以最終的運(yùn)行結(jié)果為準(zhǔn)

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

相關(guān)文章

  • redis分布式鎖的原理及代碼實(shí)例

    redis分布式鎖的原理及代碼實(shí)例

    這篇文章主要介紹了redis分布式鎖的原理及代碼實(shí)例,Redis作為一款高性能內(nèi)存數(shù)據(jù)庫(kù),其提供了一種非常實(shí)用的分布式鎖解決方案,可以幫助開(kāi)發(fā)人員輕松地實(shí)現(xiàn)分布式鎖功能,對(duì)于分布式系統(tǒng)的開(kāi)發(fā)和維護(hù),具有非常大的實(shí)用價(jià)值,需要的朋友可以參考下
    2024-01-01
  • 淺談spring-boot-rabbitmq動(dòng)態(tài)管理的方法

    淺談spring-boot-rabbitmq動(dòng)態(tài)管理的方法

    這篇文章主要介紹了淺談spring-boot-rabbitmq動(dòng)態(tài)管理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 教你如何用Eclipse創(chuàng)建一個(gè)Maven項(xiàng)目

    教你如何用Eclipse創(chuàng)建一個(gè)Maven項(xiàng)目

    這篇文章主要介紹了教你如何用Eclipse創(chuàng)建一個(gè)Maven項(xiàng)目,文中有非常詳細(xì)的代碼示例,對(duì)正在入門(mén)Java的小伙伴們是非常有幫助的喲,需要的朋友可以參考下
    2021-05-05
  • 通過(guò)實(shí)例解析Socket套接字通信原理

    通過(guò)實(shí)例解析Socket套接字通信原理

    這篇文章主要介紹了通過(guò)實(shí)例解析Socket套接字通信原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • springcloud項(xiàng)目改名的操作方法

    springcloud項(xiàng)目改名的操作方法

    這篇文章主要介紹了springcloud項(xiàng)目改名的操作方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java代碼執(zhí)行字符串中的邏輯運(yùn)算方法

    java代碼執(zhí)行字符串中的邏輯運(yùn)算方法

    今天小編就為大家分享一篇java代碼執(zhí)行字符串中的邏輯運(yùn)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解Java回環(huán)屏障CyclicBarrier

    詳解Java回環(huán)屏障CyclicBarrier

    這篇文章主要介紹了Java回環(huán)屏障CyclicBarrier的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    這篇文章主要給大家介紹了關(guān)于Java中轉(zhuǎn)換器設(shè)計(jì)模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java獲取手機(jī)已安裝APK的簽名摘要

    java獲取手機(jī)已安裝APK的簽名摘要

    這篇文章主要介紹了java獲取手機(jī)已安裝APK的簽名摘要的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • SpringBoot 如何使用RestTemplate來(lái)調(diào)用接口

    SpringBoot 如何使用RestTemplate來(lái)調(diào)用接口

    這篇文章主要介紹了SpringBoot 如何使用RestTemplate來(lái)調(diào)用接口方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論