目录
- 1、什么是拦截器
- 2、使用步骤
- 3、拦截器的执行时间
- 4、多个拦截器的执行顺序
1、什么是拦截器
SpringMVC中的Interceptor拦截器是非常重要的,它的主要作用是拦截用户的指定请求,并进行相应的预处理和后处理,其拦截的时间点在“处理器映射器根据用户提交的请求映射除了所要执行的处理器类,并且也找到了要执行处理器类的处理器适配器,在处理器适配器执行持利器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与持利器组合成为了一个处理器执行立案,并返回给了中央调度器
特点
拦截器是全局的,可以对多个Controller做拦截
一个项目中可以有一个或多个拦截器
常用在用户登录处理、权限检查、记录日志
可以看做是多个Controller中公共的功能,集中到拦截器统一处理,用的依旧是AOP的思想
2、使用步骤
1、定义类(拦截器)实现接口并按需重写方法
public class MyInterceptor implements HandlerInterceptor {
/*
预处理方法:
特点:整个项目的入口,控制请求是否可以被处理
参数:被拦截的控制器对象
返回值:true 请求继续向下执行,到达下一个拦截器或者控制器
false 执行完拦截器方法后就截止
特点:在控制器方法之前执行,用户的请求先到达此方法
在这个拦截器方法中,可以获得请求信息,验证请求是否符合要求,验证用户是否有权限访问URL地址
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
System.out.println("拦截器启动");
return true;
}
/*
后处理方法
参数:被拦截的处理器对象,处理器方法的返回值
特点:处理器方法之后执行的;
能够获取到处理器方法的返回值ModelAndView,可以修改返回值的数据和视图,影响最后的执行结果
作用:对原来的执行结果进行二次修正
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
System.out.println("postHandler");
if (modelAndView != null) {
//添加数据
modelAndView.addObject("date", new Date());
}
}
/*
最后执行的方法
参数:被拦截的处理器对象;异常对象
特点:请求处理完成后执行(框架中视图处理完成后视为请求处理完成)
作用:一般用于资源回收
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
System.out.println("after");
}
}
2、在SpringMVC配置文件中声明拦截器
<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截的url地址-->
<mvc:mapping path="/user/**"/>
<!--指定拦截器-->
<bean class="com.ff.utils.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3、拦截器的执行时间
拦截器有三个执行时间:
在请求处理之前,也就是说在Controller方法执行之前
在控制器方法执行之后也会执行拦截器
在请求处理执行后也会执行拦截器
4、多个拦截器的执行顺序
如果一个项目中有多个拦截器,那么多个拦截器之间的顺序是如何的?
现在,我们往项目中添加两个拦截器,并设置两个拦截器preHandle的返回值都为真,结果为:
拦截器1的preHandle
拦截器2的preHandle
拦截器2的postHandle
拦截器1的postHandle
拦截器2的afterCompletion
拦截器1的afterCompletion