SpringMVC 之拦截器(九)

本文详细介绍了 Spring MVC 中的拦截器实现方法及工作流程。通过具体示例展示了如何自定义拦截器并配置其执行顺序,以及不同场景下拦截器的方法调用时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

定义拦截器

实现 HandlerInterceptor 接口,接口有三个重写方法:

  1. preHandle
  2. postHandle
  3. afterCompletion

 

public class HandleInterceptor1 implements HandlerInterceptor {

    /*进入Handler方法之前执行
    多用于登陆校验、权限拦截;返回ture,放行
    如:身份认证:如果 认证不通过则表明当前用户没有登陆,需要此方法拦截不再向下执行*/
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest,
                             HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("HandleInterceptor1 …… …… preHandle1");
        return true;
    }

    /*进入 Handler方法之后,返回 modelAndView 之前执行
    这里可在返回用户前对 模型数据进行加工处理,如将公用的模型数据(如菜单导航)传到页面*/
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                           Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("HandleInterceptor1 …… …… postHandle1");

    }

    /*完成后执行本方法
    这里可得到执行 handler 的异常信息
    可记录操作日志,资源清理等*/
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                Object o, Exception e) throws Exception {
        System.out.println("HandleInterceptor1 …… …… afterCompletion1");

    }
}

拦截器2 也类似;

 

拦截器配置

springMVC.xml:

    <!--多个拦截器顺序执行-->
	<mvc:interceptors>
		<mvc:interceptor>
			<!--  "/**": 表示所有url 包括子url路径 -->
			<mvc:mapping path="/**"/>
			<bean class="lxf.interceptor.HandleInterceptor1"/>
		</mvc:interceptor>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="lxf.interceptor.HandleInterceptor2"/>
		</mvc:interceptor>
	</mvc:interceptors>

 

拦截测试

测试多个拦截器 三个方法的执行时机。

 

1. 拦截器 1,2 的 preHandle 都为 true:

拦截器1 的 preHandle() 返回值为 true;

拦截器2 的 preHandle() 返回值为 true;

运行结果:

小结:

preHandle 方法按顺序执行,
postHandle 和 afterCompletion 按拦截器配置的逆向顺序执行。

 

2. 拦截器 1 的 preHandle 为 true,2 的为 false:

拦截器1 的 preHandle() 返回值为 true;

拦截器2 的 preHandle() 返回值为 false;

运行结果:

小结:

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

拦截器2 preHandle 不放行,拦截器2 postHandle 和 afterCompletion 不会执行。

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

 

3. 拦截器 1 ,2 的 preHandle 都为 false:

拦截器1 的 preHandle() 返回值为 false;

拦截器2 的 preHandle() 返回值为 false;

运行结果:

小结:

拦截器1 preHandle 不放行,postHandle 和 afterCompletion 不会执行。

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

 

总结:

根据测试结果,对拦截器应用:

  • 统一日志处理拦截器,需要该拦截器 preHandle 一定要放行,且将它放在拦截器链接中第一个位置;
  • 登陆认证拦截器,放在拦截器链接中第一个位置;
  • 权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)

 

———————————————————————————————————————————————————————— 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值