一、Interceptor定義:
攔截器是在面向切面編程中應用的,就是在你的service或者一個方法前調用一個方法,或者在方法后調用一個方法。是基於JAVA的反射機制
1.攔截器(Interceptor)執行順序:
1. 請求到達 DispatcherServlet
2. DispatcherServlet 發送至 Interceptor ,執行 preHandle
3. 請求達到 Controller
4. 請求結束后,postHandle 執行
2.攔截器(Interceptor)和過濾器(Filter)的執行順序
過濾前->攔截前->Action處理->攔截后->過濾后
3.使用方法
1)預處理preHandle()方法
用戶發送請求時,先執行preHandle()方法。會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以后所有攔截器都不會執行。若都是return true,則執行用戶請求的url方法。
2)后處理postHandle()方法
調用了Service並返回ModelAndView,但未進行頁面渲染,可以在這里繼續修改ModelAndView
3)返回處理afterCompletion()方法
已經渲染了頁面,在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。
注:一般使用preHandle這個攔截器進行預處理,對url進行請求攔截
二、Spring Boot配置方式
1.自定義攔截器,需要繼承HandlerInterceptorAdapter類
@Component public class AuthorityInterceptor extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("進入到攔截器中:preHandle() 方法"); System.out.println(request.getServletPath()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("進入到攔截器中:postHandle() 方法中"); System.out.println(request.getRequestURI()); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("進入到攔截器中:afterCompletion() 方法中"); System.out.println(request.getServletPath()); } }
2.注冊攔截器,需要繼承WebMvcConfigurerAdapter類
需要重寫addInterceptors方法,這里是對根目錄"/"進行攔截,可以指定攔截url請求目錄
@Configuration public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter { @Autowired private AuthorityInterceptor authorityInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注冊自己的攔截器並設置攔截的請求路徑 registry.addInterceptor(authorityInterceptor).addPathPatterns("/**"); super.addInterceptors(registry); } }
3.測試結果
1)用戶請求的url如下所示:

2)發送請求,進入到攔截器

三、Spring 配置方式
注冊攔截器,使用spring mvc來注冊,替換上面的1.2步驟
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.vivo.finance.web.interceptor.AuthorityInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
四、對指定方法進行攔截或對某些方法不攔截
這里的注冊監聽器,自定義監聽器寫法和前面一致。
如果對url目錄下所有的請求進行了監聽,但需要對某些請求方法不進行攔截或單獨攔截,可以采用自定義注解方式,對方法加上自定義注解,攔截器進行掃描,對出現過自定義注解的方法進行單獨處理
1.自定義注解
目標為方法,僅在運行時有效LoginSuccess可以在定義中通過反射獲取字段值,僅用注解可以不管
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LoginVerify { boolean LoginSuccess() default true; }
2.preHandle對自定義注解@LoginVerify進行攔截
preHandle對有@LoginVerify注解的方法進行單獨處理
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("進入到攔截器中:preHandle() 方法"); HandlerMethod handlerMethod=(HandlerMethod)handler; LoginVerify loginVerify=handlerMethod.getMethodAnnotation(LoginVerify.class); if (loginVerify!=null){ System.out.println(loginVerify.LoginSuccess()); logger.info("不需要對 @loginVerify注解方法 進行攔截"); }else { logger.info("對非@loginVerify注解方法 進行攔截處理"); System.out.println(request.getServletPath()); System.out.println(request.getParameter("id")); return true; } return true; }
3.自定義注解使用位置
將@LoginVerify注解施加到方法上即可
@LoginVerify(LoginSuccess=false) @RequestMapping("/test2") public String testConnection(){ System.out.println("test2"); return "test2"; }
4.實現結果
發送請求

————————————————
版權聲明:本文為CSDN博主「蒼白的詠嘆調」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kuishao1314aa/article/details/109777304
