springmvc拦截器

提示:个人学习笔记

  在springmvc工程中,拦截器作用于控制器方法,拦截器需要继承HandlerInterceptor接口

在配置文件中,拦截器的配置:

    <mvc:interceptors>
    	<!--第一种:-->
        <!--        <bean class="controller.interceptors.FirstInterceptor"></bean>-->
        
        <!--第二种:-->
        <!--        需要标识为ioc容器组件,并开启组件扫描-->
        <!--        <ref bean="firstInterceptor"></ref>-->
        
<!--上面两种配置方式:均拦截所有请求路径-->

		<!--第三种:-->

		<mvc:interceptor>
      
        <!--
        		mapping path:匹配拦截器的请求路径
        		exclude-mapping:排除拦截器的请求路径,此处即/没有配置拦截器
        -->
        
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"/>
            <ref bean="firstInterceptor"></ref>
        </mvc:interceptor>
        
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"/>
            <ref bean="secondInterceptor"></ref>
        </mvc:interceptor>
        
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"/>
            <ref bean="thirdInterceptor"></ref>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器:

//标识ioc容器组件,进行管理
@Component
public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandler-->first");
        //返回true表示对控制器方法放行
        //false即拦截,不调用控制器方法
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandler-->first");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion-->first");
    }
}

控制器方法:

//控制器方法所在的类被标识为@Controller
    @RequestMapping("/**/testInterceptor") //请求映射设置为多层目录
    public String toInterceptor(){
        System.out.println("控制器方法~~~~~~");
        return "target";//返回target视图
    }

1、其中preHandler()方法在控制器方法之前调用,当返回true表示为放行,false表示拦截,即不执行控制器方法

2、postHandler()方法在控制器方法之后调用

3、afterCompletion()方法在渲染完视图之后调用

执行效果:
在这里插入图片描述

若有多个拦截器,则执行的顺序为:

  多个拦截器的preHandler()f方法均返回true,即控制器方法都放行,执行顺序为preHandler()方法按照在配置文件中配置的顺序执行,postHandler()与afterCompletion()按照配置顺序的逆序执行;
  某个拦截器的preHandler()返回false,即不调用控制器方法,执行顺序为preHandle()返回false和它之前配置的拦截器的preHandle()顺序执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterCompletion()会执行;

将SecondInterceptor的preHandler()返回false:(控制器方法内的语句没有被执行输出)
在这里插入图片描述
源码:(preHandler是按照添加的顺序执行,postHandler和afterCompletion是按照拦截器集合所返回true的最大索引即从后往前执行)
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值