spring mvc - HandlerInterceptor使用

HandlerInterceptor接口

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 {
	}

}

方法作用:

  • preHandle: 如果返回false,请求就不会往下走
  • postHandle: preHandle返回为 true 时有效, 可以返回额外的数据model在返回View之前
  • afterCompletion: preHandle返回为 true 时有效,视图返回渲染之后,常用于资源清理

示例

现有三个实现了 HandleInterceptor 接口的拦截器:


@Component
public class HandlerItOne implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerItOne preHandle...");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler, 
				ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerItOne postHandle...");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, 
			HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("HandlerItOne afterCompletion...");
	}
}



@Component
public class HandlerItTwo implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerItTwo preHandle...");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler, 
				ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerItTwo postHandle...");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, 
			HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("HandlerItTwo afterCompletion...");
	}
}


@Component
public class HandlerItThree implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerItThree preHandle...");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request,
			 HttpServletResponse response, Object handler,
			 	 ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerItThree postHandle...");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, 
			HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("HandlerItThree afterCompletion...");
	}
}

配置文件:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="handlerItOne"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="handlerItTwo"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="handlerItThree"/>
    </mvc:interceptor>
</mvc:interceptors>

三个拦截器preHandle方法返回true

结果:


HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItThree preHandle...
HandlerItThree postHandle...
HandlerItTwo postHandle...
HandlerItOne postHandle...
HandlerItThree afterCompletion...
HandlerItTwo afterCompletion...
HandlerItOne afterCompletion...

可以发现,preHandle 方法是按照顺序执行,而 postHandle 和 afterCompletion 是按照反序执行的

HandlerItOne中的preHandle方法返回false,其他两个拦截器返回true

结果:

HandlerItOne preHandle...

同上

HandlerItTwo中的preHandle方法返回false,其他两个拦截器返回true

结果:

HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItOne afterCompletion...

同上

HandlerItThree中的preHandle方法返回false,其他两个拦截器返回true

结果:

HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItThree preHandle...
HandlerItTwo afterCompletion...
HandlerItOne afterCompletion...

同上

结论

可以发现,preHandle 方法是按照顺序执行,而 postHandle 和 afterCompletion 是按照反序执行的

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐