SpringMVC基于注解使用:拦截器

Springmvc拦截器

拦截器采用AOP的设计思想, 它跟过滤器类似, 用来拦截处理方法在之前和之后执行一些跟主业务没有关系的一些公共功能:

比如:可以实现:权限控制、日志、异常记录、记录方法执行时间…

SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截

工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。

java 实体类拦截注解 springmvc 拦截器注解_java 实体类拦截注解


拦截器一个有3个回调方法,而一般的过滤器Filter才两个:

preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try­catch­finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行

java 实体类拦截注解 springmvc 拦截器注解_拦截器_02


java 实体类拦截注解 springmvc 拦截器注解_java_03


java 实体类拦截注解 springmvc 拦截器注解_java_04


java 实体类拦截注解 springmvc 拦截器注解_拦截器_05


通过运行结果能够发现拦截器的执行顺序如下:

可以看到先执行拦截器的preHandle方法­­­­》执行目标方法­­­­》执行

拦截器的postHandle方法­­­­》执行页面跳转­­­­》执行拦截器的afterCompletion

方法在配置拦截器的时候有两个需要注意的点:

1、如果prehandle方法返回值 为false,那么意味着不放行,那么就会

造成后续的所有操作都中断

2、如果执行到方法中出现异常,那么后续流程不会处理但是

afterCompletion方法会执行

2、拦截器跟过滤器的区别

1、过滤器是基于函数回调的,而拦截器是基于java反射的

2、过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器,拦截

器依赖SpringMVC

3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对

SpringMVC请求起作用

4、拦截器可以访问处理方法的上下文,而过滤器不可以。

拦截器和过滤器的执行顺序

java 实体类拦截注解 springmvc 拦截器注解_拦截器_06


3、使用拦截器实现登录权限拦截

java 实体类拦截注解 springmvc 拦截器注解_java 实体类拦截注解_07


拦截映射和排除拦截

java 实体类拦截注解 springmvc 拦截器注解_java 实体类拦截注解_08