拦截器
- 一. 概念
- 拦截器和AOP的区别:
- 拦截器和过滤器的区别:
- 二. 入门案例
- 2.1 定义拦截器bean
- 2.2 定义配置类
- 2.3 执行流程
- 2.4 简化配置类到SpringMvcConfig中
一. 概念
引入:
消息从浏览器发送到后端,请求会先到达Tocmat服务器;
将请求划分成动态、静态资源;处理动态;
动态的资源经过Filter过滤器;
过滤器放行后才是Spring,中央控制器会根据访问分发到controller中;
controller操作执行完后,返回数据给浏览器;
当如果想让每个controller被访问之前和后做一件事---- 拦截器
如:权限控制,需要看访问是否有权限访问这个controller;
定义:拦截器是一种动态拦截方法调用的机制,在SpringMVC中动态拦截controller方法的执行;
作用:
- 在指定的方法调用前后执行预先设定的代码;
- 阻止原始方法的执行(如权限控制)
拦截器和AOP的区别:
AOP是原始方法确定会被调用,在调用前后做增强处理,拦截器是决定你能不能调用方法;
拦截器和过滤器的区别:
1.归属不同,Filter属于Servlet技术,Interceptor拦截器属于SpringMVC技术;
SpringMVC的功能可以在拦截器中操作,但不能在Filter中操作;
2.拦截范围不同:
Filter过滤器是在Tomcat服务器阶段配置,能对所有请求进行增强;
拦截器仅仅是对SpringMVC阶段操作,SpringMVC能接受哪些访问取决于容器启动配置中的设置:
二. 入门案例
2.1 定义拦截器bean
(1)在controller层新建一个拦截器层,创建一个自定义interceptor拦截器类,配置成bean;
(2)自定义拦截器类 实现 HandlerInterceptor
,并重写preHandle
、postHandle
、afterCompletion
三个方法;
preHandle
方法返回false会终止原始操作,原始操作后面的也不再执行;而true会都执行。可以用此增加判断逻辑,满足则true,不满足则false。
(3)让SpringMVC加载到拦截器;
保证SpringMVC能扫描到:
此时拦截器类就在controller目录下,不需要改;
2.2 定义配置类
(1)在config包下定义一个SpringMvcConfig配置类,类似addResourceHandlers分发者服务,继承WebMvcConfiguartionSupport
,实现 addIntercepter
方法;
(2)将之前定义的拦截器ProjectInterceptor的bean注入,
再指定路径,如当调用“/books”请求时拦截;
(3)让SpringMVC能扫描到配置类:
效果:
后台:
注意:
只有books 才会被拦截;而books/100 不会被拦截!
改: books, books/* 即可;
2.3 执行流程
在拦截器类中,preHandle
方法返回false会终止原始方法及其之后的所有操作;而返回true会都执行。
2.4 简化配置类到SpringMvcConfig中
缺点:拦截器类和Spring绑定在一起了,侵入性较强;