SpringMVC超詳細(xì)介紹自定義攔截器
1.什么是攔截器
說明
- Spring MVC 也可以使用攔截器對請求進(jìn)行攔截處理,用戶可以自定義攔截器來實(shí)現(xiàn)特定的功能.
- 自定義的攔截器必須實(shí)現(xiàn) HandlerInterceptor 接口
自定義攔截器的三個方法
- preHandle():這個方法在業(yè)務(wù)處理器處理請求之前被調(diào)用,在該方法中對用戶請求 request 進(jìn)行處理。
- postHandle():這個方法在目標(biāo)方法處理完請求后執(zhí)行
- afterCompletion():這個方法在完全處理完請求后被調(diào)用,可以在該方法中進(jìn)行一些資源 清理的操作。
2.自定義攔截器執(zhí)行流程圖

自定義攔截器執(zhí)行流程說明
- 如果 preHandle 方法 返回 false, 則不再執(zhí)行目標(biāo)方法, 可以在此指定返回頁面
- postHandle 在目標(biāo)方法被執(zhí)行后執(zhí)行. 可以在方法中訪問到目標(biāo)方法返回的 ModelAndView 對象
- 若 preHandle 返回 true, 則 afterCompletion 方法 在渲染視圖之后被執(zhí)行.
- 若 preHandle 返回 false, 則 afterCompletion 方法不會被調(diào)用
- 在配置攔截器時,可以指定該攔截器對哪些請求生效,哪些請求不生效,如果不配置默認(rèn)對所有請求生效
3.自定義攔截器應(yīng)用實(shí)例
1.快速入門
● 應(yīng)用實(shí)例需求
完成一個自定義攔截器,學(xué)習(xí)一下如何配置攔截器和攔截器的運(yùn)行流程
● 應(yīng)用實(shí)例-代碼實(shí)現(xiàn)
1.自定義攔截器
/**
* 自定義攔截器
*/
@Component
public class MyInterceptor01 implements HandlerInterceptor {
/**
* 1.preHandle 方法在目標(biāo)方法執(zhí)行前被執(zhí)行
* 2.如果返回fasle則不在執(zhí)行目標(biāo)方法
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor01 --preHandle");
return true;
}
/**
* 1. 在目標(biāo)方法執(zhí)行后,會執(zhí)行postHandle
* 2. 該方法可以獲取到 目標(biāo)方法,返回的ModelAndView對象
* @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("MyInterceptor01-postHandle");
}
/**
*1. afterCompletion() 在視圖渲染后被執(zhí)行, 這里可以進(jìn)行資源清理工作
* @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("MyInterceptor01-afterCompletion");
}
}2.配置攔截器
攔截配置有三種方式
(1)不指定攔截規(guī)則,默認(rèn)攔截所有
<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
<!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請求-->
<ref bean="myInterceptor01"></ref>
</mvc:interceptors>
(2)指定明確的攔截路徑
<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
<!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請求-->
<!--<ref bean="myInterceptor01"></ref>-->
<!--第二種指定攔截路徑-->
<mvc:interceptor>
<mvc:mapping path="/hi"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>
</mvc:interceptors>(3)通配符方式,也可用于指定不攔截路徑
<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
<!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請求-->
<!--<ref bean="myInterceptor01"></ref>-->
<!--第二種指定攔截路徑-->
<!-- <mvc:interceptor>
<mvc:mapping path="/hi"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>-->
<mvc:interceptor>
<!--通配符方式 表示攔截 /h 打頭的路徑-->
<mvc:mapping path="/h*"/>
<!--/hello不攔截-->
<mvc:exclude-mapping path="/hello"/>
<!--指定對哪個攔截器配置-->
<ref bean="myInterceptor01"/>
</mvc:interceptor>
</mvc:interceptors>
3.創(chuàng)建FurnHandler.java
@Controller
public class FurnHandler {
@RequestMapping(value = "/hi")
public String hi(User user) {
System.out.println("---FurnHandler--hi()---");
return "success";
}
@RequestMapping(value = "/hello")
public String hello() {
System.out.println("---FurnHandler--hello()---");
return "success";
}
@RequestMapping(value = "/ok")
public String ok() {
System.out.println("---FurnHandler--ok()---");
return "success";
}
}4.interceptor.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>測試自定義攔截器</title>
</head>
<body>
<h1>測試自定義攔截器</h1>
<a href="<%=request.getContextPath()%>/hi" rel="external nofollow" >測試自定義攔截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello" rel="external nofollow" >測試自定義攔截器-hello</a><br/><br/>
<a href="<%=request.getContextPath()%>/ok" rel="external nofollow" >測試自定義攔截器-ok</a><br><br>
</body>
</html>
5.測試

2.注意事項(xiàng)和細(xì)節(jié)
1、默認(rèn)配置是都所有的目標(biāo)方法都進(jìn)行攔截, 也可以指定攔截目標(biāo)方法, 比如只是攔截 hi
<mvc:interceptor>
<mvc:mapping path="/hi"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>2、mvc:mapping 支持通配符, 同時指定不對哪些目標(biāo)方法進(jìn)行攔截
<mvc:interceptor>
<mvc:mapping path="/h*"/>
<mvc:exclude-mapping path="/hello"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>3、攔截器需要配置才生效,不配置是不生效的.
4、如果 preHandler() 方法返回了 false, 就不會執(zhí)行目標(biāo)方法(前提是你的目標(biāo)方法被攔截 了), 程序員可以在這里根據(jù)業(yè)務(wù)需要指定跳轉(zhuǎn)頁面.
3.Debug執(zhí)行流程


4.多個攔截器
1.多個攔截器執(zhí)行流程示意圖
執(zhí)行流程可以參考filter過濾器,執(zhí)行順序根據(jù)配置的先后順序


2.應(yīng)用實(shí)例
代碼實(shí)現(xiàn)
新增攔截器
@Component
public class MyInterceptor02 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor02-preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor02-postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor02-afterCompletion");
}
}配置攔截器
<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
<!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請求-->
<!--<ref bean="myInterceptor01"></ref>-->
<!--第二種指定攔截路徑-->
<!-- <mvc:interceptor>
<mvc:mapping path="/hi"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>-->
<mvc:interceptor>
<!--通配符方式 表示攔截 /h 打頭的路徑-->
<mvc:mapping path="/h*"/>
<!--/hello不攔截-->
<mvc:exclude-mapping path="/hello"/>
<!--指定對哪個攔截器配置-->
<ref bean="myInterceptor01"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/hi"/>
<ref bean="myInterceptor02"/>
</mvc:interceptor>
</mvc:interceptors>
這里我們定義了兩個攔截器myInterceptor01和myInterceptor02,兩個攔截器都會對ip:port/工程路徑/hi的請求進(jìn)行攔截,執(zhí)行結(jié)果如下圖所示:

執(zhí)行流程說明:攔截器的執(zhí)行先后順序根據(jù)配置的先后順序執(zhí)行
3.主要事項(xiàng)和細(xì)節(jié)
- 如果第 1 個攔截器的 preHandle() 返回 false , 后面都不在執(zhí)行
- 如果第2個 攔 截 器 的 preHandle() 返 回 false , 就 直 接 執(zhí) 行 第1個 攔 截 器 的 afterCompletion()方法, 如果攔截器更多,規(guī)則類似
- 說明: 前面說的規(guī)則,都是目標(biāo)方法被攔截的前提
在實(shí)際開發(fā)中我們常用攔截器對登錄進(jìn)行驗(yàn)證
到此這篇關(guān)于SpringMVC超詳細(xì)介紹自定義攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 統(tǒng)一請求返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 統(tǒng)一請求返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
springcloud引入spring-cloud-starter-openfeign失敗的解決
這篇文章主要介紹了springcloud?引入spring-cloud-starter-openfeign失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
RocketMQ特性Broker存儲事務(wù)消息實(shí)現(xiàn)
這篇文章主要為大家介紹了RocketMQ特性Broker存儲事務(wù)消息實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Java中JSON字符串與java對象的互換實(shí)例詳解
這篇文章主要介紹了在java中,JSON字符串與java對象的相互轉(zhuǎn)換實(shí)例詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
java實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行命令行與上傳下載文件
這篇文章主要介紹了java實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行命令行與上傳下載文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式
這篇文章主要介紹了Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù)
這篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))
Sa-Token?是一個輕量級?java?權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán)?等一系列權(quán)限相關(guān)問題,這篇文章主要介紹了SpringBoot使用Sa-Token完成注解鑒權(quán)功能,需要的朋友可以參考下2023-05-05

