簡介: 講解攔截器使用,Spingboot2.x新版本配置攔截攔截器和舊版本SpringBoot配置攔截器區別講解
1、@Configuration
繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本)
SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer
2、自定義攔截器 HandlerInterceptor
preHandle:調用Controller某個方法之前
postHandle:Controller之后調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法
afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理
3、按照注冊順序進行攔截,先注冊,先被攔截
攔截器不生效常見問題:
1)是否有加@Configuration
2)攔截路徑是否有問題 ** 和 *
3)攔截器最后路徑一定要 “/**”, 如果是目錄的話則是 /*/
Filter
是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
Filter在只在Servlet前后起作用,而Interceptor夠深入到方法前后、異常拋出前后等
依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境。
在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
Filter和Interceptor的執行順序
過濾前->攔截前->action執行->攔截后->過濾后
代碼示例:
CustomWebMvcConfigurer.java
1 package net.xdclass.demo.intecpter; 2 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 5 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 7 8 @Configuration 9 public class CustomWebMvcConfigurer implements WebMvcConfigurer { 10 11 @Override 12 public void addInterceptors(InterceptorRegistry registry) { 13 14 //'/*'匹配一個文件夾 15 registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*/**"); 16 registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**"); 17 18 //.excludePathPatterns("/api2/xxx/**"); //攔截全部 /*/*/** 19 20 WebMvcConfigurer.super.addInterceptors(registry); 21 } 22 23 24 25 26 27 28 }
LoginIntercepter.java:
1 package net.xdclass.demo.intecpter; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 public class LoginIntercepter implements HandlerInterceptor{ 10 11 /** 12 * 進入controller方法之前 13 */ 14 @Override 15 public boolean preHandle(HttpServletRequest request, 16 HttpServletResponse response, Object handler) throws Exception { 17 System.out.println("LoginIntercepter------->preHandle"); 18 19 // String token = request.getParameter("access_token"); 20 21 // response.getWriter().print("fail"); 22 23 return HandlerInterceptor.super.preHandle(request, response, handler); 24 } 25 26 /** 27 * 調用完controller之后,視圖渲染之前 28 */ 29 @Override 30 public void postHandle(HttpServletRequest request, 31 HttpServletResponse response, Object handler, 32 ModelAndView modelAndView) throws Exception { 33 34 System.out.println("LoginIntercepter------->postHandle"); 35 36 HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); 37 } 38 39 /** 40 * 整個完成之后,通常用於資源清理 41 */ 42 @Override 43 public void afterCompletion(HttpServletRequest request, 44 HttpServletResponse response, Object handler, Exception ex) 45 throws Exception { 46 System.out.println("LoginIntercepter------->afterCompletion"); 47 48 HandlerInterceptor.super.afterCompletion(request, response, handler, ex); 49 } 50 51 52 53 }
TwoIntercepter.java:
1 package net.xdclass.demo.intecpter; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 public class TwoIntercepter implements HandlerInterceptor{ 10 11 /** 12 * 進入對應的controller方法之前 13 */ 14 @Override 15 public boolean preHandle(HttpServletRequest request, 16 HttpServletResponse response, Object handler) throws Exception { 17 18 System.out.println("TwoIntercepter------>preHandle"); 19 return HandlerInterceptor.super.preHandle(request, response, handler); 20 } 21 22 /** 23 * controller處理之后,返回對應的視圖之前 24 */ 25 @Override 26 public void postHandle(HttpServletRequest request, 27 HttpServletResponse response, Object handler, 28 ModelAndView modelAndView) throws Exception { 29 System.out.println("TwoIntercepter------>postHandle"); 30 HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); 31 } 32 33 /** 34 * 整個請求結束后調用,視圖渲染后,主要用於資源的清理 35 */ 36 @Override 37 public void afterCompletion(HttpServletRequest request, 38 HttpServletResponse response, Object handler, Exception ex) 39 throws Exception { 40 System.out.println("TwoIntercepter------>afterCompletion"); 41 HandlerInterceptor.super.afterCompletion(request, response, handler, ex); 42 } 43 44 45 }
測試代碼:
瀏覽器訪問:http://localhost:8083/api2/v1/account
控制台查看: