提示:个人学习笔记
在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的最大索引即从后往前执行)