您当前的位置: 首页 >  spring

杨林伟

暂无认证

  • 3浏览

    0关注

    3337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

56SpringMVC - 拦截器

杨林伟 发布时间:2019-04-08 17:39:51 ,浏览量:3

定义

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

实现HandlerInterceptor接口,如下:

public class HandlerInterceptor1 implements HandlerInterceptor {
	// controller执行后且视图返回后调用此方法
	// 这里可得到执行controller时的异常信息
	// 这里可记录操作日志
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("HandlerInterceptor1....afterCompletion");
	}

	// controller执行后但未返回视图前调用此方法
	// 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("HandlerInterceptor1....postHandle");
	}

	// Controller执行前调用此方法
	// 返回true表示继续执行,返回false中止执行
	// 这里可以加入登录校验、权限拦截等
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("HandlerInterceptor1....preHandle");
		// 设置为true,测试使用
		return true;
	}
}
拦截器配置

上面定义的拦截器再复制一份HandlerInterceptor2,注意新的拦截器修改代码: System.out.println(“HandlerInterceptor2…preHandle”);

在springmvc.xml中配置拦截器




	
		
		
		
		
	
	
	
		
		
		
		
	


正常流程测试

浏览器访问地址 http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程

控制台打印:

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

HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..
中断流程测试

浏览器访问地址 http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程

HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

HandlerInterceptor1…preHandle…

从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且Controller也不执行了。

HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

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

从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

总结:
  • preHandle按拦截器定义顺序调用

  • postHandler按拦截器定义逆序调用

  • afterCompletion按拦截器定义逆序调用

  • postHandler在拦截器链内所有拦截器返成功调用

  • afterCompletion只有preHandle返回true才调用

关注
打赏
1662376985
查看更多评论
立即登录/注册

微信扫码登录

0.1919s