SpringMVC超詳細(xì)介紹自定義攔截器
1.什么是攔截器
說明
- Spring MVC 也可以使用攔截器對請求進(jìn)行攔截處理,用戶可以自定義攔截器來實現(xiàn)特定的功能.
- 自定義的攔截器必須實現(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)用實例
1.快速入門
● 應(yīng)用實例需求
完成一個自定義攔截器,學(xué)習(xí)一下如何配置攔截器和攔截器的運行流程
● 應(yīng)用實例-代碼實現(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.注意事項和細(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)用實例
代碼實現(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.主要事項和細(xì)節(jié)
- 如果第 1 個攔截器的 preHandle() 返回 false , 后面都不在執(zhí)行
- 如果第2個 攔 截 器 的 preHandle() 返 回 false , 就 直 接 執(zhí) 行 第1個 攔 截 器 的 afterCompletion()方法, 如果攔截器更多,規(guī)則類似
- 說明: 前面說的規(guī)則,都是目標(biāo)方法被攔截的前提
在實際開發(fā)中我們常用攔截器對登錄進(jìn)行驗證
到此這篇關(guān)于SpringMVC超詳細(xì)介紹自定義攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot MainApplication類文件的位置詳解
這篇文章主要介紹了SpringBoot MainApplication類文件的位置詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Netty分布式高性能工具類recycler的使用及創(chuàng)建
這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03springboot+redis實現(xiàn)微博熱搜排行榜的示例代碼
本文主要介紹了springboot+redis實現(xiàn)微博熱搜排行榜的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05SpringCloud項目的log4j2漏洞解決方案詳解流程
很多小伙伴因為Log4j2的驚爆0Day漏洞一時束手無策,這里提供最終解決方案可以進(jìn)行一個版本號的升級,感興趣的朋友來看看吧2022-04-04