SpringBoot開(kāi)發(fā)之?dāng)r截器實(shí)例
1 攔截器
列如常見(jiàn)的登錄攔截校驗(yàn):
1 HandlerInterceptor 接口
/** * 登錄檢查 * 1、配置好攔截器要攔截哪些請(qǐng)求 * 2、把這些配置放在容器中 */ @Slf4j public class LoginInterceptor implements HandlerInterceptor { /** * 目標(biāo)方法執(zhí)行之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); log.info("preHandle攔截的請(qǐng)求路徑是{}",requestURI); // 登錄檢查邏輯 HttpSession session = request.getSession(); Object loginUser = session.getAttribute("loginUser"); if(loginUser != null){ // 放行 return true; } // 攔截住。未登錄。跳轉(zhuǎn)到登錄頁(yè) request.setAttribute("msg","請(qǐng)先登錄"); // re.sendRedirect("/"); request.getRequestDispatcher("/").forward(request,response); return false; } /** * 目標(biāo)方法執(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 { log.info("postHandle執(zhí)行{}",modelAndView); } /** * 頁(yè)面渲染以后 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("afterCompletion執(zhí)行異常{}",ex); } }
2 配置攔截器
/** * 1、編寫一個(gè)攔截器實(shí)現(xiàn)HandlerInterceptor接口 * 2、攔截器注冊(cè)到容器中(實(shí)現(xiàn)WebMvcConfigurer的addInterceptors) * 3、指定攔截規(guī)則【如果是攔截所有,靜態(tài)資源也會(huì)被攔截】 */ @Configuration public class AdminWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**") // 所有請(qǐng)求都被攔截包括靜態(tài)資源 .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); // 放行的請(qǐng)求 } }
2 攔截器原理
1 根據(jù)當(dāng)前請(qǐng)求,找到**HandlerExecutionChain【**可以處理請(qǐng)求的handler以及handler的所有 攔截器】
2 先來(lái)順序執(zhí)行 所有攔截器的 preHandle方法
- 如果當(dāng)前攔截器prehandler返回為true。則執(zhí)行下一個(gè)攔截器的preHandle
- 如果當(dāng)前攔截器返回為false。直接倒序執(zhí)行所有已經(jīng)執(zhí)行了的攔截器的 afterCompletion;
3 如果任何一個(gè)攔截器返回false。直接跳出不執(zhí)行目標(biāo)方法
4 所有攔截器都返回True。執(zhí)行目標(biāo)方法
5 倒序執(zhí)行所有攔截器的postHandle方法
6 前面的步驟有任何異常都會(huì)直接倒序觸發(fā) afterCompletion
7 頁(yè)面成功渲染完成以后,也會(huì)倒序觸發(fā) afterCompletion
到此這篇關(guān)于SpringBoot開(kāi)發(fā)之?dāng)r截器詳解的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之JDK1.8新特性lambda表達(dá)式詳解
函數(shù)式接口有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口,函數(shù)式接口可以被隱式轉(zhuǎn)換為lambda表達(dá)式,這篇文章主要介紹了Java基礎(chǔ)之lambda表達(dá)式(JDK1.8新特性),需要的朋友可以參考下2023-08-08ArrayList和JSONArray邊遍歷邊刪除到底該如何做
這篇文章主要介紹了ArrayList和JSONArray邊遍歷邊刪除到底該如何做,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12利用Java手寫一個(gè)簡(jiǎn)易的lombok的示例代碼
Lombok是一款Java開(kāi)發(fā)插件,使得Java開(kāi)發(fā)者可以通過(guò)其定義的一系列注解來(lái)消除業(yè)務(wù)工程中冗長(zhǎng)和繁瑣的代碼,尤其對(duì)于簡(jiǎn)單的Java模型對(duì)象。本文就來(lái)手寫一個(gè)簡(jiǎn)易的lombok,需要的可以參考一下2022-10-10Java如何根據(jù)key值修改Hashmap中的value值
這篇文章主要介紹了Java如何根據(jù)key值修改Hashmap中的value值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java8中forEach語(yǔ)句循環(huán)一個(gè)List和Map
這篇文章主要給大家介紹了關(guān)于Java8中forEach語(yǔ)句循環(huán)一個(gè)List和Map的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02java利用注解實(shí)現(xiàn)簡(jiǎn)單的excel數(shù)據(jù)讀取
這篇文章主要為大家詳細(xì)介紹了java利用注解實(shí)現(xiàn)簡(jiǎn)單的excel數(shù)據(jù)讀取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Java中的while循環(huán)語(yǔ)句詳細(xì)講解
這篇文章主要給大家介紹了關(guān)于Java中while循環(huán)語(yǔ)句的相關(guān)資料,while循環(huán)是一種在編程中常見(jiàn)的控制流語(yǔ)句,它允許代碼在特定條件下(通常是一個(gè)布爾表達(dá)式)重復(fù)執(zhí)行一段代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03