深入探究SpringBoot攔截器的自定義設計與實現(xiàn)全攻略
一. 什么是攔截器?
- 需要修改每個接口的處理邏輯
- 需要修改每個接口的返回結果
- 接口定義修改,前端代碼也需要跟著修改
有沒有更簡單的辦法,統(tǒng)?攔截所有的請求,并進行Session校驗呢,這里我們學習?種新的解決辦法:攔截器
攔截器是Spring框架提供的核心功能之?,主要用來攔截用戶的請求,在指定方法前后,根據(jù)業(yè)務需要執(zhí)行預先設定的代碼.也就是說,允許開發(fā)?員提前預定義?些邏輯,在用戶的請求響應前后執(zhí)行.也可以在用戶請求前阻止其執(zhí)行.
在攔截器當中,開發(fā)?員可以在應用程序中做?些通用性的操作,比如通過攔截器來攔截前端發(fā)來的
請求,判斷Session中是否有登錄用戶的信息.如果有就可以放行,如果沒有就進行攔截.
二. 攔截器執(zhí)行流程
正常的調用順序:
有了攔截器之后,會在調用Controller之前進行相應的業(yè)務處理,執(zhí)行的流程如下圖
- 添加攔截器后,執(zhí)行Controller的方法之前,請求會先被攔截器攔截住.執(zhí)行 preHandle() 方法,這個方法需要返回?個布爾類型的值.如果返回true,就表示放行本次操作,繼續(xù)訪問controller中的方法.如果返回false,則不會放行(controller中的方法也不會執(zhí)行).
- controller當中的方法執(zhí)行完畢后,再回過來執(zhí)行 postHandle() 這個方法以及afterCompletion() 方法,執(zhí)行完畢之后,最終給瀏覽器響應數(shù)據(jù).
三. 攔截器
攔截器的基本使用.
攔截器的使用步驟分為兩步:
- 定義攔截器
- 注冊配置攔截器
- 攔截器的攔截路徑配置
3.1 定義攔截器
自定義攔截器:實現(xiàn)HandlerInterceptor接口,并重寫其所有方法
@Slf4j @Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception { log.info("LoginInterceptor 目標方法執(zhí)行前執(zhí)行.."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler, ModelAndView modelAndView) throws Exception { log.info("LoginInterceptor 目標方法執(zhí)行后執(zhí)行"); } @Override public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("LoginInterceptor 視圖渲染完畢后執(zhí)行,最后執(zhí)行"); } }
- preHandle()方法:目標方法執(zhí)行前執(zhí)行.返回true:繼續(xù)執(zhí)行后續(xù)操作;返回false:中斷后續(xù)操作.
- postHandle()方法:目標方法執(zhí)行后執(zhí)行
- afterCompletion()方法:視圖渲染完畢后執(zhí)行,最后執(zhí)行(后端開發(fā)現(xiàn)在?乎不涉及視圖,暫不了 解)
3.2 注冊配置攔截器
注冊配置攔截器:實現(xiàn)WebMvcConfigurer接口,并重寫addInterceptors方法
@Configuration public class WebConfig implements WebMvcConfigurer { //?定義的攔截器對象 @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注冊?定義攔截器對象 registry.addInterceptor(loginInterceptor).addPathPatterns("/**");//設置攔截器攔截的請求路徑( /** 表示攔截所有請求) } }
啟動服務,試試訪問任意請求,觀察后端日志
可以看到preHandle方法執(zhí)行之后就放行了,開始執(zhí)行目標方法,目標方法執(zhí)行完成之后執(zhí)行postHandle和afterCompletion方法.
我們把攔截器中preHandle方法的返回值改為false,再觀察運行結果
可以看到,攔截器攔截了請求,沒有進行響應.
3.3 攔截路徑的配置
攔截路徑是指我們定義的這個攔截器,對哪些請求生效.
我們在注冊配置攔截器的時候,通過 addPathPatterns() 方法指定要攔截哪些請求.也可以通過excludePathPatterns() 指定不攔截哪些請求.
上述代碼中,我們配置的是 /** ,表示攔截所有的請求.
比如用戶登錄校驗,我們希望可以對除了登錄之外所有的路徑生效
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { //?定義的攔截器對象 @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注冊?定義攔截器對象 registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns("/user/login");//設置攔截器攔截的請求路徑 (/** 表示攔截所有請求) } }
在攔截器中除了可以設置 /** 攔截所有資源外,還有?些常見攔截路徑設置:
攔截路徑 | 含義 | 舉例 |
---|---|---|
/* | ?級路徑 | 能匹配/user,/book,/login,不能匹配/user/login |
/** | 任意級路徑 | 能匹配/user,/user/login,/user/reg |
/book/* | /book下的?級路徑 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book |
/book/** | /book下的任意級路徑 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login |
以上攔截規(guī)則可以攔截此項目中的使用URL,包括靜態(tài)文件(圖片文件,JS和CSS等文件).
以上就是深入探究SpringBoot攔截器的自定義設計與實現(xiàn)全攻略的詳細內容,更多關于SpringBoot攔截器設計與實現(xiàn)的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot對接AWS?S3實現(xiàn)上傳和查詢
AWS?S3是亞馬遜提供的一種對象存儲服務,旨在提供可擴展、高可用性和安全的數(shù)據(jù)存儲解決方案,本文我們就來看看SpringBoot如何對接AWS?S3實現(xiàn)上傳和查詢吧2025-02-02SpringBoot的配置文件(properties與yml)使用方法
配置文件中的配置類型有兩類,一類是系統(tǒng)配置項,這種配置的格式都是固定的,是給系統(tǒng)使用的,另一種是用戶自定義配置,用戶可以隨意地規(guī)定配置項的格式,又用戶自行去設置和讀取,這篇文章主要介紹了SpringBoot的配置文件(properties與yml)使用方法,需要的朋友可以參考下2023-08-08深入理解SpringMVC中央調度器DispatcherServlet
這篇文章主要介紹了SpringMVC核心之中央調度器DispatcherServlet的相關知識,包括SpringMVC請求處理過程及SrpingMVC容器和spring?IOC容器關系,需要的朋友可以參考下2022-05-05jackson 實現(xiàn)null轉0 以及0轉null的示例代碼
這篇文章主要介紹了jackson 實現(xiàn)null轉0 以及0轉null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java畢業(yè)設計實戰(zhàn)之二手書商城系統(tǒng)的實現(xiàn)
這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的二手書商城系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有在線書城該有的所有功能,感興趣的朋友快來看看吧2022-01-01詳解Java如何進行Base64的編碼(Encode)與解碼(Decode)
這篇文章主要介紹了詳解Java如何進行Base64的編碼(Encode)與解碼(Decode),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03Java?Web實現(xiàn)簡易圖書管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java?Web實現(xiàn)簡易圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09