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

SpringMVC攔截器快速掌握下篇

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

攔截器參數(shù)

前置處理方法

原始方法之前運行preHandle

public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}
  • request:請求對象
  • response:響應對象
  • handler:被調用的處理器對象,本質上是一個方法對象,對反射中的Method對象進行了再包裝

使用request對象可以獲取請求數(shù)據(jù)中的內容,如獲取請求頭的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ù),可以獲取方法的相關信息

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

后置處理方法

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

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

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

modelAndView:如果處理器執(zhí)行完成具有返回結果,可以讀取到對應數(shù)據(jù)與頁面信息,并進行調整

因為咱們現(xiàn)在都是返回json數(shù)據(jù),所以該參數(shù)的使用率不高。

完成處理方法

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

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

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

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

因為我們現(xiàn)在已經(jīng)有全局異常處理器類,所以該參數(shù)的使用率也不高。

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

攔截器鏈配置

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

配置多個攔截器

創(chuàng)建攔截器類

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

@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");
    }
}

配置攔截器類

@Configuration
@ComponentScan({"com.nefu.controller"})
@EnableWebMvc
//實現(xiàn)WebMvcConfigurer接口可以簡化開發(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/*");
    }
}

然后我們運行程序,觀察順序:

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

  • 當配置多個攔截器時,形成攔截器鏈
  • 攔截器鏈的運行順序參照攔截器添加順序為準
  • 當攔截器中出現(xiàn)對原始處理器的攔截,后面的攔截器均終止運行
  • 當攔截器運行中斷,僅運行配置在前面的攔截器的afterCompletion操作

preHandle:與配置順序相同,必定運行

postHandle:與配置順序相反,可能不運行

afterCompletion:與配置順序相反,可能不運行。

這個順序不太好記,最終只需要把握住一個原則即可:以最終的運行結果為準

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

相關文章

  • IDEA插件之mybatisx插件使用教程(超詳細!)

    IDEA插件之mybatisx插件使用教程(超詳細!)

    MybatisX 是一款基于IDEA的快速開發(fā)插件,為效率而生,下面這篇文章主要給大家介紹了關于IDEA插件之mybatisx插件使用的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • mybatis中的if?test判斷入?yún)⒌闹祮栴}

    mybatis中的if?test判斷入?yún)⒌闹祮栴}

    這篇文章主要介紹了mybatis中的if?test判斷入?yún)⒌闹祮栴},具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • IDEA創(chuàng)建springboot + mybatis項目全過程(步驟詳解)

    IDEA創(chuàng)建springboot + mybatis項目全過程(步驟詳解)

    這篇文章主要介紹了IDEA創(chuàng)建springboot + mybatis項目全過程及步驟詳解,本文通圖文實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 探討Java中函數(shù)是值傳遞還是引用傳遞問題

    探討Java中函數(shù)是值傳遞還是引用傳遞問題

    這篇文章主要介紹了探討Java中函數(shù)是值傳遞還是引用傳遞問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Spring手寫簡化版MVC流程詳解

    Spring手寫簡化版MVC流程詳解

    Spring MVC是Spring Framework的一部分,是基于Java實現(xiàn)MVC的輕量級Web框架。本文將通過簡單示例帶大家掌握SpringMVC簡化版手寫方法,感興趣的可以了解一下
    2022-11-11
  • Java主流壓縮解壓工具對比、用法與選取詳解

    Java主流壓縮解壓工具對比、用法與選取詳解

    開發(fā)過程中可能會用到壓縮文件的需求,下面這篇文章主要給大家介紹了關于Java主流壓縮解壓工具對比、用法與選取的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • springboot?publish?event?事件機制demo分享

    springboot?publish?event?事件機制demo分享

    這篇文章主要介紹了springboot?publish?event?事件機制demo,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 關于RequestMapping注解的作用說明

    關于RequestMapping注解的作用說明

    這篇文章主要介紹了關于RequestMapping注解的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 10分鐘帶你徒手寫個Java線程池

    10分鐘帶你徒手寫個Java線程池

    我們自己手動實現(xiàn)的線程池要比Java自身的線程池簡單的多,我們去掉了各種復雜的處理方式,只保留了最核心的原理,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-04-04
  • 在java中ArrayList集合底層的擴容原理

    在java中ArrayList集合底層的擴容原理

    這篇文章主要介紹了在java中ArrayList集合底層的擴容原理,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

吴忠市| 阿拉善左旗| 康马县| 天镇县| 西盟| 长乐市| 克山县| 札达县| 玉田县| 高阳县| 兴山县| 弋阳县| 泰来县| 古交市| 济南市| 南丰县| 平武县| 民乐县| 启东市| 手游| 龙井市| 德昌县| 陵水| 淅川县| 民乐县| 射洪县| 漳浦县| 营口市| 昆明市| 金塔县| 利津县| 深水埗区| 田阳县| 岳阳县| 正安县| 宾阳县| 灌阳县| 常熟市| 东乡| 成都市| 黄骅市|