web項(xiàng)目中攔截器的處理流程

前言

一、包圍圈和流程圖

攔截器.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原理的文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容