Spring HandlerInterceptor、Spring AOP、Servlet Filter 三者的区别及源码解析

Spring HandlerInterceptor、Spring AOP、Servlet Filter 三者的区别及源码解析

一:执行顺序

Servlet Filter🠒HandlerInterceptor🠒Aop

二:源码解析
(一)Spring Interceptor

​ spring提供了一个HandlerInterceptor接口 ,其中包含三个方法 预处理preHandle()方法后处理postHandle()方法返回处理afterCompletion()方法

public interface HandlerInterceptor {
   
   default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
   
		return true;
	}
    
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
   
	}
    
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
   
	}
}

1)(预处理)preHandle 方法
      Spring HandlerInterceptor、Spring AOP、Servlet Filter 三者的区别及源码解析用户发出请求时,会先按照顺序执行所有拦截器的preHandle方法,如果方法 return true;则继续执行用户请求的执行链,如果是return false 则停止后面的执行链。

2)(后处理)postHandle方法
      用户逻辑代码执行完毕后,在进行视图渲染之前执行此方法。可在此方法中对视图、 数据做逻辑修改。

3)(返回处理)afterCompletion方法
      此方法仅仅只会在前面所有的执行链成功执行完成之后才会被调用,且该方法将在链中的每个拦截器上按相反的顺序调用,因此第一个拦截器将是最后一个被调用的。

​ 在springMvc中 用户发起的所有请求都会在DispatcherServlet中进行处理,DispatcherServlet的角色就相当于是调度控制中心,它的作用就是找到每个需要参与的角色,按次序调用每个角色进行处理,HandlerInterceptor就是其中一个角色。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
		HttpServletRequest processedRequest = request;
		HandlerExecutionChain mappedHandler = null;
		boolean multipartRequestParsed = false;
		WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
		try {
   
			ModelAndView mv = null;
			Exception dispatchException = null;
			try {
   
				processedRequest = checkMultipart(request);
				multipartRequestParsed = (processedRequest != request);
				// 找到当前处理器映射器
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
   
                      //如果没有找到就会保 No mapping for....控制器 并终止后续的执行。
					noHandlerFound(processedRequest, response);
					return;
				}
				// 根据映射器找到当前对应的处理适配器
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
				// 如果处理程序支持,则处理最后修改的报头。 
				String method = request.getMethod();
				boolean isGet = "GET".equals(method);
				if (isGet || "HEAD".equals(method)) {
   
					long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
   
						return;
					}
				}
                //如果执行链应该继续执行下一个拦截器或处理程序本身,则应用已注册拦截器的preHandle方法。 否则,DispatcherServlet假定这个拦截器已经处理了响应本身。 
				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
   
					return;
				}
				// 处理器适配器实际调用处
				mv = ha.handle(processedRequest, response, mappedHandler.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值