前言
一、包圍圈和流程圖

攔截器.png

image.png
二、Filter說明
package javax.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
// 可以看到Filter是在servlet包里面的
// web請(qǐng)求是從這個(gè)地方進(jìn)來的,所以請(qǐng)求會(huì)先經(jīng)過filter處理
// 這個(gè)方法有三個(gè)參數(shù)
// ServletRequest 請(qǐng)求信息
// ServletResponse 響應(yīng)信息
// FilterChain攔截鏈
// 請(qǐng)求進(jìn)入到doFilter方法中時(shí),方法可以處理請(qǐng)求,返回結(jié)果,然后再將他們丟入到攔截鏈中
// 攔截鏈中是具備了request和reponse的內(nèi)容的,所以內(nèi)層的方法也是可以處理請(qǐng)求和響應(yīng)的
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
三、HandlerInterceptor說明
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
// 該攔截器在webMvc的包中
// 它和Filter有明顯的不一樣,這里是HttpServletRequest和HttpServletResponse
// 而Filter中ServletRequest和ServletResponse
// 因此這個(gè)攔截器指向處理HTTP請(qǐng)求
public interface HandlerInterceptor {
// 方法名為preHandle,顧名思義是在處理方法之前執(zhí)行的邏輯
// 看接口參數(shù),包含了請(qǐng)求和響應(yīng),所以它可以處理請(qǐng)求和響應(yīng)
// 因此功能上來說其實(shí)和Filter差不多
// 其次它還多了handler參數(shù),可以傳入handler處理業(yè)務(wù)
// 它的返回結(jié)果如果是false,就表示不執(zhí)行后面的邏輯了,表示任務(wù)處理到它這里就完成了
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
// 方法名為postHandle,顧名思義它是一個(gè)后置處理器
// HandlerInterceptor實(shí)例在攔截鏈的越前面,postHandle就在越后面執(zhí)行
// 其他的方面和preHandler差不多
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
// 這個(gè)方法用在request處理完成之后,這樣就可以做一些收尾工作
// 但是它還是沒有逃離Filter的包圍,它還在Filter包圍圈內(nèi)部
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
四、AOP說明
AOP實(shí)際上也是攔截器,采用了動(dòng)態(tài)代理的模式,會(huì)有JDK代理和cglib兩種形式,AOP注解主要放在方法和類上面,從它的放置位置可以知道,它的處理對(duì)象是實(shí)際處理業(yè)務(wù)的方法(Controller中的方法或者Controller下一層的業(yè)務(wù)處理方法等),即它更加貼近我們具體的業(yè)務(wù)。
要詳細(xì)了解AOP處理流程,可以查看我的另外一篇關(guān)于AOP原理的文章