web项目中拦截器的处理流程

前言

一、包围圈和流程图

拦截器.png

image.png

二、Filter说明

package javax.servlet;

import java.io.IOException;

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    // 可以看到Filter是在servlet包里面的
    // web请求是从这个地方进来的,所以请求会先经过filter处理
    // 这个方法有三个参数
    // ServletRequest 请求信息
    // ServletResponse 响应信息
    // FilterChain拦截链
    // 请求进入到doFilter方法中时,方法可以处理请求,返回结果,然后再将他们丢入到拦截链中
    // 拦截链中是具备了request和reponse的内容的,所以内层的方法也是可以处理请求和响应的
    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
// 因此这个拦截器指向处理HTTP请求
public interface HandlerInterceptor {

    // 方法名为preHandle,顾名思义是在处理方法之前执行的逻辑
    // 看接口参数,包含了请求和响应,所以它可以处理请求和响应
    // 因此功能上来说其实和Filter差不多
    // 其次它还多了handler参数,可以传入handler处理业务
    // 它的返回结果如果是false,就表示不执行后面的逻辑了,表示任务处理到它这里就完成了
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return true;
    }

    // 方法名为postHandle,顾名思义它是一个后置处理器
    // HandlerInterceptor实例在拦截链的越前面,postHandle就在越后面执行
    // 其他的方面和preHandler差不多
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

    // 这个方法用在request处理完成之后,这样就可以做一些收尾工作
    // 但是它还是没有逃离Filter的包围,它还在Filter包围圈内部
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}

四、AOP说明

AOP实际上也是拦截器,采用了动态代理的模式,会有JDK代理和cglib两种形式,AOP注解主要放在方法和类上面,从它的放置位置可以知道,它的处理对象是实际处理业务的方法(Controller中的方法或者Controller下一层的业务处理方法等),即它更加贴近我们具体的业务。
要详细了解AOP处理流程,可以查看我的另外一篇关于AOP原理的文章

你可能感兴趣的:(web项目中拦截器的处理流程)