有天上飛的概念,就要有落地的實現
概念十遍不如代碼一遍,朋友,希望你把文中所有的代碼案例都敲一遍
先贊後看,養成習慣
SpringBoot 圖文教程系列文章目錄
- SpringBoot圖文教程1「概念+案例 思維導圖」「基礎篇上」
- SpringBoot圖文教程2—日誌的使用「logback」「log4j」
- SpringBoot圖文教程3—「‘初戀’情結」集成Jsp
- SpringBoot圖文教程4—SpringBoot 實現文件上傳下載
- SpringBoot圖文教程5—SpringBoot 中使用Aop
- SpringBoot圖文教程6—SpringBoot中過濾器的使用
本文內容
前言
攔截器是Spring中的概念,和過濾器類似,可以對用戶請求進行攔截過濾處理。但是相對於過濾器而言,攔截器要的控制更加的細節,攔截器可以在三個地方進行執行。
- 可以在請求到達Controller控制器之前 通過攔截器執行一段代碼
- 也可以在控制器執行之後,通過攔截器執行一段代碼 【此時只是Controller執行完畢 視圖還沒有開始渲染】
- 最後在整個請求結束的時候還可以通過攔截器執行一段時間代碼
整個工作過程如下圖
SpringBoot中攔截器的使用
需求:在項目中創建一個UserController,然後在UserController的前後使用攔截器打印一些信息
所以首先我們開發一個UserController
攔截器使用的開發步驟
創建攔截器類 註冊攔截器 配置攔截規則
- 創建攔截器類
<code>/** * @Component 和 @Service 是一個作用 創建對象 */ @Component public class MyInterceptor1 implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(MyInterceptor1.class); /** * 在請求到達Controller控制器之前 通過攔截器執行一段代碼 * 如果方法返回true,繼續執行後續操作 * 如果返回false,執行中斷請求處理,請求不會發送到Controller */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("攔截器1 在控制器執行之前執行"); return true; } /** * 控制器之後,跳轉前 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("攔截器1 在控制器執行之後執行"); } /** * 跳轉之後執行 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("攔截器1 最後執行"); } }/<code>
- 註冊攔截器,配置攔截規則
<code>@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyInterceptor1 myInterceptor1; /** * 註冊攔截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { /** * addInterceptor 註冊攔截器 * addPathPatterns 配置攔截規則 */ registry.addInterceptor(myInterceptor1) .addPathPatterns("/**"); } }/<code>
細節補充
postHandle方法中ModelAndView參數
在postHandle方法中有一個參數是ModelAndView。這個對象在SpringMvc中是一個關鍵對象,可以進行參數傳遞和路徑跳轉。
ModelAndView 向request作用域存入數據:mav.addObject("作用域數據的name",值);設置跳轉路徑:mav.setViewName("跳轉方式:/目標資源url-pattern");作用: model作用+跳轉路徑的作用
public ModelAndView xxx(ModelAndView mav){
//1. 向requset作用域存入一個數據
mav.addObject("name",值);
//2. 跳轉到xxx.jsp
mav.setViewName("跳轉方式:/目標資源url-pattern");
return mav;
}
通過ModelAndView 我們可以在 postHandle方法中 操作作用域的值 和 設置修改跳轉路徑
一次性攔截多個路徑
在註冊攔截器的時候 配置攔截路徑的addPathPatterns參數為可變長參數,就意味著可以接受String的數組,可以配置多個參數。
addPathPatterns方法的源碼如下
排除攔截路徑
註冊多個攔截器
我們可以實現多個攔截器,並依次將他們註冊進去
<code> public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor1) .addPathPatterns("/**"); registry.addInterceptor(myInterceptor2) .addPathPatterns("/**"); }/<code>
關於多個攔截器的執行順序設置
- 在不做任何設置的時候,多個攔截器的執行順序和註冊的順序有關,先註冊的先執行
- 也可以通過Order方法來設置 執行的順序 值越小越先執行
總結
以上就是SpringBoot中攔截器的簡單使用。
恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。
讓我們再次回顧本文的學習目標
掌握SpringBoot中攔截器的使用
要掌握SpringBoot更多的用法,請持續關注本系列教程。
下面體貼的我給朋友萌還準備了一些 自測面試題和項目案例,希望你能夠成熱打鐵,將知識夯紮實。
自測面試題(答案見下期)
- 攔截器和過濾器有什麼區別?
上期自測面試題答案,見面試題集錦 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
自測實現項目小案例(答案見下期)
本次需求:
練習文中demo
上期自測實現項目小案例答案,見碼雲倉庫 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
求關注,求點贊,求轉發
關鍵字: ModelAndView 教程 addPathPatterns