SpringMVC框架自定義攔截器的過程詳解
一、攔截器
1. 概述
- SpringMVC框架中的攔截器用于對處理器(Controller層)進(jìn)行預(yù)處理和后處理的技術(shù)。
- 可以定義攔截器鏈,攔截器鏈就是將攔截器按著一定順序結(jié)成一條鏈,在訪問被攔截的方法中,攔截器鏈中的攔截器會按著定義的順序執(zhí)行。
- 攔截器也是AOP思想的一種實(shí)現(xiàn)方法。
- 想要自定義攔截器,需要實(shí)現(xiàn)HandlerInterceptor接口。
2. HandlerInterceptor接口中的方法
preHandle方法:是執(zhí)行Controller方法前攔截的方法- 可以使用request或response跳轉(zhuǎn)到指定的頁面。
return true:攔截,放行,執(zhí)行下一個(gè)攔截器,如果沒有攔截器,執(zhí)行Controller中的方法。return false:攔截,不放行,不執(zhí)行Controller中的方法。
postHandle方法:是執(zhí)行Controller方法后攔截的方法,在JSP視圖執(zhí)行前- 可以使用request或response跳轉(zhuǎn)到指定的頁面。
- 如果跳轉(zhuǎn)到指定的頁面,那么Controller方法跳轉(zhuǎn)的頁面將不會顯示。
afterCompletion方法:是JSP執(zhí)行后在執(zhí)行的方法- request或response不能再跳轉(zhuǎn)頁面了。
3. 攔截器執(zhí)行流程圖

4. 攔截器和過濾器的區(qū)別
- 過濾器是Servlet規(guī)范的一部分,任何框架都可以使用過濾器。
- 攔截器是SpringMVC框架獨(dú)有的。
- 過濾器配置
/*,可以攔截任何資源。 - 攔截器只會對控制器中的方法進(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的完整指南
在企業(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ù)管理
這篇文章介紹了SpringBoot中使用@Transactional注解進(jìn)行聲明式事務(wù)管理的詳細(xì)信息,包括基本用法、核心配置參數(shù)、關(guān)鍵注意事項(xiàng)、調(diào)試技巧、最佳實(shí)踐以及完整示例,感興趣的朋友一起看看吧2025-02-02
Java中ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
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
SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案
這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧2020-10-10

