Spring MVC 拦截器

拦截器的执行流程图

代码清单

在Spring MVC的配置文件中配置拦截器(这里配置了两个拦截器)

<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 配置要拦截的请求 -->
			<mvc:mapping path="/*"/>
			<!-- 配置自定义的拦截器 -->
			<bean class="com.zgz.springmvc.interceptors.FirstInterceptor"></bean>
		</mvc:interceptor>
		<mvc:interceptor>
			<!-- 配置多个拦截器 -->			
			<mvc:mapping path="/*"/>
			<bean class="com.zgz.springmvc.interceptors.SecondInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

拦截器必须实现HandlerInterceptor接口,该接口定义了三个方法,掌握这三个方法的作用和有多个拦截器时的执行过程即可 多个拦截器时的执行流程图 两个拦截器

public class FirstInterceptor implements HandlerInterceptor {
	
	/**
	 * 该方法在目标方法之前调用
	 * 若该方法返回值为true,则继续调用后续的拦截器和目标方法
	 * 若返回值为false,则不会调用后续的拦截器和目标方法
	 * 
	 * 可以考虑做权限,日志,事务等
	 * @return
	 * @throws Exception
	 */
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("preHandle: ");
		return true;
	}
	
	/**
	 * 调用目标方法之后,但在渲染视图之前
	 * 可以对请求域中的属性或视图做出修改
	 * @throws Exception
	 */
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle: ");
	}
	
	/***
	 * 渲染试图之后被调用
	 * 可以释放资源
	 * @throws Exception
	 */
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("afterCompletion: ");
	}

}
public class SecondInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("preHandle2: ");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle2: ");
	}

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("afterCompletion2: ");
	}

}

执行结果