日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

精盡Spring MVC源碼分析 - HandlerMapping 組件(二)之 HandlerInterceptor 攔截器

 行者花雕 2021-06-15

該系列文檔是本人在學(xué)習(xí) Spring MVC 的源碼過(guò)程中總結(jié)下來(lái)的,可能對(duì)讀者不太友好,請(qǐng)結(jié)合我的源碼注釋 Spring MVC 源碼分析 GitHub 地址 進(jìn)行閱讀

Spring 版本:5.1.14.RELEASE

該系列其他文檔請(qǐng)查看:《精盡 Spring MVC 源碼分析 - 文章導(dǎo)讀》

HandlerMapping 組件

HandlerMapping 組件,請(qǐng)求的處理器匹配器,負(fù)責(zé)為請(qǐng)求找到合適的 HandlerExecutionChain 處理器執(zhí)行鏈,包含處理器(handler)和攔截器們(interceptors

  • handler 處理器是 Object 類型,可以將其理解成 HandlerMethod 對(duì)象(例如我們使用最多的 @RequestMapping 注解所標(biāo)注的方法會(huì)解析成該對(duì)象),包含了方法的所有信息,通過(guò)該對(duì)象能夠執(zhí)行該方法

  • HandlerInterceptor 攔截器對(duì)處理請(qǐng)求進(jìn)行增強(qiáng)處理,可用于在執(zhí)行方法前、成功執(zhí)行方法后、處理完成后進(jìn)行一些邏輯處理

由于 HandlerMapping 組件涉及到的內(nèi)容比較多,考慮到內(nèi)容的排版,所以將這部分內(nèi)容拆分成了四個(gè)模塊,依次進(jìn)行分析:

HandlerMapping 組件(二)之 HandlerInterceptor 攔截器

在上一篇《HandlerMapping 組件(一)之 AbstractHandlerMapping》文檔中分析了 HandlerMapping 組件的 AbstractHandlerMapping 抽象類,在獲取HandlerExecutionChain 處理器執(zhí)行鏈時(shí),會(huì)去尋找匹配的 HandlerInterceptor 攔截器們,并添加到其中。那么本文將分享 Spring MVC 的攔截器相關(guān)內(nèi)容

HandlerInterceptor

org.springframework.web.servlet.HandlerInterceptor,處理器攔截器接口,代碼如下:

public interface HandlerInterceptor {
/**
 * 前置處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行之前
 */
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {

return true;
}

/**
 * 后置處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行成功之后
 */
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}

/**
 * 完成處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行之后(無(wú)論成功還是失?。? * 條件:執(zhí)行 {@link #preHandle(HttpServletRequest, HttpServletResponse, Object)} 成功的攔截器才會(huì)執(zhí)行該方法
 */
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}

HandlerExecutionChain

org.springframework.web.servlet.HandlerExecutionChain,處理器執(zhí)行鏈,也就是通過(guò) HandlerMapping 組件為請(qǐng)求找到的處理對(duì)象,包含處理器(handler)和攔截器們(interceptors

構(gòu)造方法

public class HandlerExecutionChain {
/**
 * 處理器
 */
private final Object handler;

/**
 * 攔截器數(shù)組
 */
@Nullable
private HandlerInterceptor[] interceptors;

/**
 * 攔截器數(shù)組。
 *
 * 在實(shí)際使用時(shí),會(huì)調(diào)用 {@link #getInterceptors()} 方法,初始化到 {@link #interceptors} 中
 */
@Nullable
private List<HandlerInterceptor> interceptorList;

/**
 * 已成功執(zhí)行 {@link HandlerInterceptor#preHandle(HttpServletRequest, HttpServletResponse, Object)} 的位置
 *
 * 在 {@link #applyPostHandle} 和 {@link #triggerAfterCompletion} 方法中需要用到,用于倒序執(zhí)行攔截器的方法
 */
private int interceptorIndex = -1;

public HandlerExecutionChain(Object handler) {
this(handler, (HandlerInterceptor[]) null);
}

public HandlerExecutionChain(Object handler, @Nullable HandlerInterceptor... interceptors) {
if (handler instanceof HandlerExecutionChain) {
HandlerExecutionChain originalChain = (HandlerExecutionChain) handler;
this.handler = originalChain.getHandler();
this.interceptorList = new ArrayList<>();
// 將原始的 HandlerExecutionChain 的 interceptors 復(fù)制到 this.interceptorList 中
CollectionUtils.mergeArrayIntoCollection(originalChain.getInterceptors(), this.interceptorList);
// 將入?yún)⒌?nbsp;interceptors 合并到 this.interceptorList 中
CollectionUtils.mergeArrayIntoCollection(interceptors, this.interceptorList);
} else {
this.handler = handler;
this.interceptors = interceptors;
}
}
}
  • handler:請(qǐng)求對(duì)應(yīng)的處理器對(duì)象,可以先理解為 HandlerMethod 對(duì)象(例如我們常用的 @RequestMapping 注解對(duì)應(yīng)的方法會(huì)解析成該對(duì)象),也就是我們的某個(gè) Method 的所有信息,可以被執(zhí)行

  • interceptors:請(qǐng)求匹配的攔截器數(shù)組

  • interceptorList:請(qǐng)求匹配的攔截器集合,至于為什么要該屬性,我還沒(méi)看明白 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多