spring mvc-HandlerInterceptor使用

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 是按照反序执行的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值