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

SpringMVC框架自定義攔截器的過程詳解

 更新時(shí)間:2025年11月24日 09:17:52   作者:好好研究  
文章主要介紹了SpringMVC框架中的攔截器及其工作原理,包括攔截器的定義、執(zhí)行流程、與過濾器的區(qū)別,以及如何自定義和配置攔截器,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

一、攔截器

1. 概述

  1. SpringMVC框架中的攔截器用于對處理器(Controller層)進(jìn)行預(yù)處理后處理的技術(shù)。
  2. 可以定義攔截器鏈,攔截器鏈就是將攔截器按著一定順序結(jié)成一條鏈,在訪問被攔截的方法中,攔截器鏈中的攔截器會按著定義的順序執(zhí)行。
  3. 攔截器也是AOP思想的一種實(shí)現(xiàn)方法。
  4. 想要自定義攔截器,需要實(shí)現(xiàn)HandlerInterceptor接口。

2. HandlerInterceptor接口中的方法

  1. preHandle方法:是執(zhí)行Controller方法前攔截的方法
    • 可以使用request或response跳轉(zhuǎn)到指定的頁面。
    • return true攔截,放行,執(zhí)行下一個(gè)攔截器,如果沒有攔截器,執(zhí)行Controller中的方法。
    • return false攔截,不放行,不執(zhí)行Controller中的方法
  2. postHandle方法:是執(zhí)行Controller方法后攔截的方法,在JSP視圖執(zhí)行前
    • 可以使用request或response跳轉(zhuǎn)到指定的頁面。
    • 如果跳轉(zhuǎn)到指定的頁面,那么Controller方法跳轉(zhuǎn)的頁面將不會顯示。
  3. afterCompletion方法:是JSP執(zhí)行后在執(zhí)行的方法
    • request或response不能再跳轉(zhuǎn)頁面了。

3. 攔截器執(zhí)行流程圖

4. 攔截器和過濾器的區(qū)別

  1. 過濾器是Servlet規(guī)范的一部分,任何框架都可以使用過濾器。
  2. 攔截器是SpringMVC框架獨(dú)有的。
  3. 過濾器配置/*,可以攔截任何資源。
  4. 攔截器只會對控制器中的方法進(jìn)行攔截。

二、自定義攔截器

1. 配置一個(gè)攔截器

處理器(Controller層)中的方法

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/dept")
@Controller
public class DeptController {
    /**
     * 測試方法
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findALL(){
        System.out.println("測試攔截器,執(zhí)行了……");
        return "suc";
    }
}

創(chuàng)建攔截器類,實(shí)現(xiàn)HandlerInterceptor接口,重寫需要的方法

<!--配置攔截器們-->
<mvc:interceptors>
    <!--配置攔截器1-->
    <mvc:interceptor>
        <!--攔截哪些資源-->
        <mvc:mapping path="/dept/**"/>
        <!--不攔截哪些資源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--攔截器對象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

在springmvc.xml文件中配置攔截器

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 攔截器類
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 攔截器之前:攔截controller中的findAll方法,放行,執(zhí)行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor中的攔截器preHandle方法執(zhí)行了……");
        // return false - 攔截,不放行;return true - 攔截,放行
        return true;
    }
    /**
     * 攔截器之后:controller方法執(zhí)行后,要攔截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor中的postHandle方法執(zhí)行了……");
        // 可以進(jìn)行頁面跳轉(zhuǎn)
        request.getRequestDispatcher("/pages/suc.jsp").forward(request,response);
        return;
    }
    /**
     * controller跳轉(zhuǎn)的jsp頁面都執(zhí)行完成了,最后執(zhí)行該方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor中的afterComplrtion方法執(zhí)行了……");
    }
}

輸出結(jié)果:

MyInterceptor中的攔截器preHandle方法執(zhí)行了……
測試攔截器,執(zhí)行了……
MyInterceptor中的postHandle方法執(zhí)行了……
MyInterceptor中的afterComplrtion方法執(zhí)行了……

2. 配置多個(gè)攔截器

再編寫一個(gè)攔截器類

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 攔截器類
 * 配置多個(gè)攔截器
 */
public class MyInterceptor2 implements HandlerInterceptor {
    /**
     * 攔截controller中的方法,但放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor2的攔截器preHandle方法執(zhí)行了……");
        // 放行
        return true;
    }
    /**
     * controller方法執(zhí)行后,要攔截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor2的postHandle方法執(zhí)行了……");
    }
    /**
     * controller跳轉(zhuǎn)的jsp頁面都執(zhí)行完成了,最后執(zhí)行該方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor2的afterComplrtion方法執(zhí)行了……");
    }
}

再springmvc.xml文件中配置多個(gè)攔截器類

<!--配置攔截器們-->
<mvc:interceptors>
    <!--配置攔截器1-->
    <mvc:interceptor>
        <!--攔截哪些資源-->
        <mvc:mapping path="/dept/**"/>
        <!--不攔截哪些資源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--攔截器對象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
    <!--配置攔截器2-->
    <mvc:interceptor>
        <!--攔截哪些資源-->
        <mvc:mapping path="/**"/>
        <!--攔截器對象-->
        <bean class="com.qcby.demo4.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

輸出結(jié)果

MyInterceptor中的攔截器preHandle方法執(zhí)行了……
MyInterceptor2的攔截器preHandle方法執(zhí)行了……
測試攔截器,執(zhí)行了……
MyInterceptor2的postHandle方法執(zhí)行了……
MyInterceptor中的postHandle方法執(zhí)行了……
MyInterceptor2的afterComplrtion方法執(zhí)行了……
MyInterceptor中的afterComplrtion方法執(zhí)行了……

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

相關(guān)文章

  • Java實(shí)現(xiàn)RTF轉(zhuǎn)Word的完整指南

    Java實(shí)現(xiàn)RTF轉(zhuǎn)Word的完整指南

    在企業(yè)辦公自動化、文檔管理系統(tǒng)以及跨平臺應(yīng)用中,文檔格式的兼容性問題一直是開發(fā)者面臨的常見挑戰(zhàn),在實(shí)際開發(fā)中,如何在 Java 環(huán)境下高效地將 RTF 文檔轉(zhuǎn)換為 Word 文檔是開發(fā)者經(jīng)常遇到的需求,本文將介紹如何使用Java將RTF轉(zhuǎn)換為Word,需要的朋友可以參考下
    2025-12-12
  • 如何使用Spring boot的@Transactional進(jìn)行事務(wù)管理

    如何使用Spring boot的@Transactional進(jìn)行事務(wù)管理

    這篇文章介紹了SpringBoot中使用@Transactional注解進(jìn)行聲明式事務(wù)管理的詳細(xì)信息,包括基本用法、核心配置參數(shù)、關(guān)鍵注意事項(xiàng)、調(diào)試技巧、最佳實(shí)踐以及完整示例,感興趣的朋友一起看看吧
    2025-02-02
  • Java中ArrayList和LinkedList的區(qū)別

    Java中ArrayList和LinkedList的區(qū)別

    ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java多線程之線程安全問題詳解

    Java多線程之線程安全問題詳解

    Java中的多線程編程是指使用Java語言創(chuàng)建和控制線程的能力,這篇文章主要介紹了Java多線程之線程安全問題的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • java中Map遍歷的四種方式總結(jié)

    java中Map遍歷的四種方式總結(jié)

    Map集合遍歷日常開發(fā)最常使用,下面這篇文章主要給大家總結(jié)介紹了關(guān)于java中Map遍歷的四種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java 后端HTTP 請求(GET/POST)傳輸規(guī)范

    Java 后端HTTP 請求(GET/POST)傳輸規(guī)范

    文章詳細(xì)闡述了RESTful API設(shè)計(jì)的最佳實(shí)踐,涵蓋了GET和POST請求的規(guī)范、參數(shù)傳遞、響應(yīng)體、版本控制、日志記錄等,本文介紹實(shí)例代碼介紹了Java后端HTTP請求(GET/POST)傳輸規(guī)范,感興趣的朋友一起看看吧
    2026-04-04
  • 解決Thymeleaf中onclick的坑

    解決Thymeleaf中onclick的坑

    Thymeleaf中onclick屬性無法直接傳遞字符串參數(shù),需改用data-*屬性存儲,再通過JS讀取,避免模板解析錯誤,但可能仍有警告
    2025-08-08
  • javacv ffmpeg使用原生ffmpeg命令方式

    javacv ffmpeg使用原生ffmpeg命令方式

    在使用javacv集成ffmpeg進(jìn)行視頻處理時(shí),發(fā)現(xiàn)使用ffmpeg-6.0-1.5.9版本出現(xiàn)原生命令執(zhí)行失敗的問題,通過降級至ffmpeg-5.1.2-1.5.8版本,問題得到解決,此外,ffprobe可以用于獲取視頻屬性,需確保視頻片段屬性一致性
    2024-11-11
  • Java快速掌握Vector類方法

    Java快速掌握Vector類方法

    Vector?類實(shí)現(xiàn)了一個(gè)動態(tài)數(shù)組。和?ArrayList?很相似,但是兩者是不同的:Vector?是同步訪問的;Vector?包含了許多傳統(tǒng)的方法,這些方法不屬于集合框架
    2022-03-03
  • SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧
    2020-10-10

最新評論

奉节县| 浠水县| 鄂伦春自治旗| 黄浦区| 滦平县| 南部县| 宜阳县| 攀枝花市| 牟定县| 瓦房店市| 襄樊市| 尼玛县| 城市| 和平县| 麻阳| 屏东市| 黑河市| 连云港市| 沙田区| 扬中市| 泰来县| 呼玛县| 砀山县| 台东县| 西充县| 黎城县| 武川县| 通江县| 武鸣县| 新巴尔虎左旗| 合江县| 松江区| 特克斯县| 弥勒县| 富锦市| 台中市| 大新县| 柞水县| 张家界市| 建阳市| 施甸县|