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

SpringMVC攔截器創(chuàng)建配置及執(zhí)行順序

 更新時(shí)間:2022年05月28日 11:28:32   作者:把蘋果咬哭的測試筆記  
這篇文章主要為大家介紹了SpringMVC攔截器創(chuàng)建配置及執(zhí)行順序,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

SpringMVC攔截器介紹

springMVC 中的攔截器用于攔截控制器方法的執(zhí)行。

先創(chuàng)建出前置需要的一些條件:

<a th:href="@{/testInterceptor}" rel="external nofollow" >測試攔截器</a>

后端:

@Controller
public class TestController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor() {
        return "success";
    }
}

一、創(chuàng)建攔截器

新建一個(gè)包 interceptors,在下面創(chuàng)建一個(gè)攔截器 FirstInterceptor ,并且要實(shí)現(xiàn) HandlerInterceptor 接口。

快捷鍵Ctrl + O,快速重寫方法,圖示里的 3 個(gè)。

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

preHandle: 在當(dāng)前控制器方法執(zhí)行之前執(zhí)行。

postHandle: 在當(dāng)前控制器方法執(zhí)行之后執(zhí)行。

afterCompletion:處理完視圖和模型數(shù)據(jù),渲染視圖完畢之后執(zhí)行。

二、配置攔截器

在 springMVC 配置文件里配置攔截器,對象就是FirstInterceptor 類:

<!-- 配置攔截器 -->
  <mvc:interceptors>
      <bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
  </mvc:interceptors>

重新部署,訪問http://localhost:8080/springmvc/,發(fā)現(xiàn)頁面空白,查看控制器日志看到有打?。?/p>

說明攔截成功。

看下上面重新的三個(gè)方法中,只有preHandle有返回值,是個(gè)布爾類型:false 表示攔截,true 表示放行。

修改上面preHandle的返回為 true,重新部署后再次訪問首頁,可以訪問成功。

查看控制臺(tái)打印輸出,看到在渲染之前,前面2個(gè)方法執(zhí)行了:preHandle、postHandle 。

在非常多的 Thymeleaf 渲染之后,最后一個(gè) afterCompletion 也執(zhí)行了。

現(xiàn)在繼續(xù)點(diǎn)擊首頁里的新加的超鏈接,發(fā)現(xiàn)也會(huì)被攔截放行。

說明這種配置方式,會(huì)攔截所有的請求。

設(shè)置不需要攔截的請求

可以通過 ref 或 bean 標(biāo)簽設(shè)置攔截器:

  • 通過mvc:mapping設(shè)置需要攔截的請求通過
  • mvc:exclude-mapping設(shè)置需要排除的請求
<bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
    <!-- 配置攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"></mvc:exclude-mapping>
            <ref bean="firstInterceptor"></ref>
        </mvc:interceptor>
    </mvc:interceptors>

注意這里我在外部注冊了一個(gè) bean 叫 firstInterceptor,以便 ref 引用。

  • <mvc:mapping path="/**"/>,表示攔截所有請求。
  • <mvc:exclude-mapping path="/">,表示除了首頁不攔截。

也就是說,現(xiàn)在我訪問http://localhost:8080/springmvc/的時(shí)候,應(yīng)該不攔截。

訪問http://localhost:8080/springmvc/testInterceptor就會(huì)攔截了。

試一下,先訪問 http://localhost:8080/springmvc/:

可以正常打開首頁,并且控制臺(tái)也沒有輸出攔截器里的內(nèi)容:

現(xiàn)在繼續(xù)訪問 http://localhost:8080/springmvc/testInterceptor,

攔截了。

三、多個(gè)攔截器的執(zhí)行順序

繼續(xù)新建一個(gè)攔截器SecondInterceptor,注意這次我加了 @Component,方便在配置文件中直接ref引用使用。

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

修改攔截器配置:

<!-- 配置攔截器 -->
    <mvc:interceptors>
        <ref bean="firstInterceptor"></ref>
        <ref bean="secondInterceptor"></ref>
    </mvc:interceptors>

重新部署,訪問下首頁http://localhost:8080/springmvc/,查看控制臺(tái)打印輸出。

可以發(fā)現(xiàn),preHandle 方法執(zhí)行的順序是 FirstInterceptor->SecondInterceptor。其他 2 個(gè)方法則是順序倒過來。

若每個(gè)攔截器的 preHandle()都返回 true:

  • 執(zhí)行順序跟配置里的順序有關(guān),在上面攔截器里 firstInterceptor 就是在 secondInterceptor前面。
  • preHandle()會(huì)按照配置的順序執(zhí)行,而postHandle()和afterComplation()`會(huì)按照配置的反序執(zhí)行。

若某個(gè)攔截器的preHandle()返回了false:

  • preHandle()返回false和它之前的攔截器的preHandle()都會(huì)執(zhí)行。
  • postHandle()都不執(zhí)行。
  • 返回false的攔截器之前的攔截器的afterComplation()會(huì)執(zhí)行。

試一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次請求下首頁:

符合預(yù)期。

這些過程可以打斷點(diǎn)看下源碼的執(zhí)行過程。

以上就是SpringMVC攔截器創(chuàng)建配置及執(zhí)行順序的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC攔截器配置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java使用DateFormatter格式化日期時(shí)間的方法示例

    Java使用DateFormatter格式化日期時(shí)間的方法示例

    這篇文章主要介紹了Java使用DateFormatter格式化日期時(shí)間的方法,結(jié)合具體實(shí)例分析了java使用DateFormatter格式化日期時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • Spring Aop基本流程原理示例詳解

    Spring Aop基本流程原理示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Aop基本流程原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • JAVA Future類的使用詳解

    JAVA Future類的使用詳解

    這篇文章主要介紹了JAVA Future類的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java 模擬真正的并發(fā)請求詳情

    Java 模擬真正的并發(fā)請求詳情

    有時(shí)需要測試一下某個(gè)功能的并發(fā)性能,又不要想借助于其他工具,索性就自己的開發(fā)語言,來一個(gè)并發(fā)請求就最方便了。下文我們就來學(xué)習(xí)Java 如何模擬真正的并發(fā)請求
    2021-09-09
  • 在SpringBoot中添加Redis及配置方法

    在SpringBoot中添加Redis及配置方法

    這篇文章主要介紹了在SpringBoot中添加Redis及配置redis的代碼,需要的朋友可以參考下
    2018-10-10
  • Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查功能

    Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查功能

    這篇文章主要介紹了Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java Lambda表達(dá)式入門示例

    Java Lambda表達(dá)式入門示例

    這篇文章主要介紹了Java Lambda表達(dá)式,結(jié)合簡單實(shí)例形式分析了Lambda表達(dá)式功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • SpringBoot實(shí)現(xiàn)統(tǒng)一功能處理的教程詳解

    SpringBoot實(shí)現(xiàn)統(tǒng)一功能處理的教程詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)統(tǒng)一功能處理,文中的示例代碼講解詳細(xì),對大家學(xué)習(xí)或工作有一定借鑒價(jià)值,感興趣的同學(xué)可以參考閱讀下
    2023-05-05
  • Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法,涉及Java數(shù)學(xué)運(yùn)算計(jì)算隨機(jī)數(shù)及字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • java中hashmap容量的初始化實(shí)現(xiàn)

    java中hashmap容量的初始化實(shí)現(xiàn)

    這篇文章主要介紹了java中hashmap容量的初始化實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

镇江市| 慈利县| 莱州市| 平潭县| 绥化市| 华容县| 额尔古纳市| 婺源县| 建阳市| 嘉黎县| 安化县| 栾川县| 镶黄旗| 当阳市| 潼南县| 竹北市| 芮城县| 孟村| 新巴尔虎左旗| 金沙县| 镇宁| 马鞍山市| 凤庆县| 阿克陶县| 阜平县| 香河县| 富阳市| 南通市| 原阳县| 溆浦县| 邹平县| 祁门县| 清徐县| 西林县| 信阳市| 博兴县| 乌苏市| 桃江县| 高雄县| 凯里市| 大竹县|