1. 什么是拦截器
拦截器(Interceptor)类似于Servlet中的过滤器,主要用于拦截客户请求并做出相应的处理。与过滤器有如下区别:
- 过滤器只能在容器初始化时被调用一次,在action的生命周期中,而拦截器可以多次被调用。
- 过滤器可以对几乎所有的请求起作用,拦截器只能对action请求起作用。
- 过滤器不能访问action上下文、值栈里的对象,而拦截器可以访问。
- 过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
- 过滤器是基于函数回调,而拦截器是基于java的反射机制的。
- 过滤器不能获取IOC容器中的各个bean,而拦截器可以,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
2. 拦截器的特点
- 请求到达经过拦截器,响应回来也经过拦截器
- 只能拦截控制器相关请求不能拦截JSP请求
- 拦截器可以中断用户请求轨迹
3. 拦截器的作用
将多个控制器中共有代码放入拦截器可以减少控制器代码冗余
4. spring中开发拦截器步骤
1. 创建自定义拦截器
创建一个自定义拦截器,实现HandlerInterceptor。
重写HandlerInterceptor中的三个方法:
- preHandle:在处理请求之前执行
- postHandle:在处理请求之后执行
- afterCompletion:顾名思义,在响应成功后执行
2. 实现WebMvcConfigurer配置器
以前一般继承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter类,不过SrpingBoot 2.0以上WebMvcConfigurerAdapter类就过时了。
现在直接实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口。
3. controller里创建接口
我这边示例,就直接使用拦截器里定义的方法了。
4. 访问
下面 我们依次访问两个接口
首先访问被拦截的login接口,我们发现,控制台输出了我们定义的输出
再访问没有被拦截的get接口,发现,控制台只输出了方法内返回的内容,并没有返回拦截器的内容。
到此,一个简易的拦截器就成功了,我们可以根据业务的不同在拦截器里面实现业务的逻辑了。😄
源码地址:点击访问欢迎学习并star
58