前言
一、包围圈和流程图
二、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原理的文章