SpringMVC自定义多个拦截器执行顺序

话不多说直接上代码

一、正常流程下的拦截器(全部放行)

1.springMVC中拦截器实现这个接口HandlerInterceptor

第一个拦截器 HandlerInterceptor1

public class HandlerInterceptor1 implements HandlerInterceptor {
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerInterceptor1...preHandle");
		//return false表示拦截,不向下执行
		//return true表示放行
		return true;
	}
	//进入Handler方法之后,返回modelAndView之前执行
	//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerInterceptor1...postHandle");
	}
	//执行Handler完成执行此方法
	//应用场景:统一异常处理,统一日志处理
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("HandlerInterceptor1...afterCompletion");
	}
}
第二个拦截器 HandlerInterceptor2
public class HandlerInterceptor2 implements HandlerInterceptor {
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerInterceptor2...preHandle");
		//return false表示拦截,不向下执行
		//return true表示放行
		return true;
	}
	//进入Handler方法之后,返回modelAndView之前执行
	//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("HandlerInterceptor2...postHandle");
	}
	//执行Handler完成执行此方法
	//应用场景:统一异常处理,统一日志处理
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("HandlerInterceptor2...afterCompletion");
	}
}
springMVC.xml中配置两个拦截器

<!--拦截器 -->
<mvc:interceptors>
	<!--多个拦截器,顺序执行 -->
	<mvc:interceptor>
		<!-- /**表示所有url包括子url路径 -->
		<mvc:mapping path="/**"/>
		<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
	</mvc:interceptor>
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
	</mvc:interceptor>
</mvc:interceptors>
查看打印的日志信息


HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle

HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle

HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion

这是正常的拦截器执行流程

以上执行的拦截器是正常流程的拦截器的顺序

二、非正常情况下的拦截器(第一个拦截器放行,第二个拦截器拦截)

      细心的读者会发现在拦截器中preHandle方法中的返回值我做了注解,  //return false表示拦截,不向下执行//return true表示放行

public class HandlerInterceptor2 implements HandlerInterceptor {
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerInterceptor1...preHandle");
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}

再次启动系统拦截器的执行顺序

日志打印

HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion

总结

拦截器1放行,拦截器2 preHandle才会执行。

拦截器2 preHandle不放行,拦截器2 postHandleafterCompletion不会执行。

只要有一个拦截器不放行,postHandle不会执行。


二、非正常情况下的拦截器(第一个拦截器拦截,第二个拦截器拦截)

public class HandlerInterceptor1 implements HandlerInterceptor {
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerInterceptor1...preHandle");
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}
public class HandlerInterceptor2 implements HandlerInterceptor {
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("HandlerInterceptor2...preHandle");
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}

日志打印

HandlerInterceptor1...preHandle

总结

拦截器1 preHandle不放行,postHandleafterCompletion不会执行。

拦截器1 preHandle不放行,拦截器2不执行。



Spring MVC 中配置多个拦截器可以通过以下步骤完成: 1. 创建拦截器类:首先,你需要创建多个拦截器类,这些类需要实现 `HandlerInterceptor` 接口。这个接口包含了三个方法 `preHandle`、`postHandle` 和 `afterCompletion`,你可以在这些方法中编写自定义的拦截逻辑。 2. 配置拦截器:在 Spring MVC 的配置文件中,通常是 `springmvc-servlet.xml`(如果你是使用 XML 配置的话),或者是 `WebConfig.java`(如果你是使用 Java 配置的话),添加拦截器配置。 - XML 配置方式: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/path1/**"/> <!-- 设置拦截路径1 --> <bean class="com.example.Interceptor1"/> <!-- 设置拦截器1 --> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/path2/**"/> <!-- 设置拦截路径2 --> <bean class="com.example.Interceptor2"/> <!-- 设置拦截器2 --> </mvc:interceptor> </mvc:interceptors> ``` - Java 配置方式: ```java @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new Interceptor1()).addPathPatterns("/path1/**"); // 设置拦截路径1和拦截器1 registry.addInterceptor(new Interceptor2()).addPathPatterns("/path2/**"); // 设置拦截路径2和拦截器2 } } ``` 你可以根据需要添加更多的拦截器配置。 3. 配置拦截路径:在拦截器配置中,你可以使用 `path` 或者 `pathPatterns` 属性来设置拦截路径。使用 `path` 属性可以设置单个路径,使用 `pathPatterns` 属性可以使用 Ant 风格的通配符来匹配多个路径。 例如: - `path="/path"`:匹配单个路径 - `pathPatterns="/path/*"`:匹配 `/path/abc`、`/path/def` 等路径 这样,当请求的 URL 匹配到拦截路径时,对应的拦截器将会被调用。你可以根据实际需求配置多个拦截器,并按照顺序执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值