1.什么是拦截器?
拦截器的主要是基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法,甚至在抛出异常的时候做业务逻辑的操作。
拦截器的作用类似于Servlet 中的Filter,都可以用于对处理器进行预处理和后处理。在Spring MVC 与Spring Boot 中使用拦截器一般是实现
HandlerInterceptor
接口。
HandlerInterceptor
接口提供了三个方法。下面分别对这三个方法作具体介绍。public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
- preHandle():这个方法可以实现处理器的预处理,也就是它会在handler 方法执行之前就开始执行。当返回值是true 时表示继续执行,返回false 时则不会执行后续的拦截器或处理器。作用:身份验证,身份授权等。
- postHandle():这个方法是后处理回调方法,也就是在控制器完成后(试图渲染之前)执行。作用:将公用的模型数据传到视图,也可以在这里统一指定视图(菜单导航等)。
- afterCompletion():这个方法是请求处理完毕后的回调方法,即在视图渲染完毕时调用。作用:进行统一的异常处理,日志处理等。
2、拦截器特点
1.请求到达经过拦截器,响应回来也经过拦截器
2.只能拦截控制器相关请求不能拦截JSP请求
3.拦截器可以中断用户请求轨迹
3、拦截器作用
将多个控制器中共有代码放入拦截器可以减少控制器代码冗余
4、springmvc中开发拦截器步骤
1.实现HandlerInterceptor接口(或继承其实现类)或者实现WebRequestInterceptor(或继承其实现类)。
2.XML文件中配置拦截器
5、springboot中使用拦截器
在springboot中开发拦截器与mvc中类似,只是用注解代替了xml文件配置。
自定义配置器:
然后实现WebMvcConfigurer配置器。
以前一般继承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter类,不过SrpingBoot 2.0以上WebMvcConfigurerAdapter类就过时了。有以下2中替代方法:
1.直接实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口。(推荐)
2.继承org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport类。但是WebMvcConfigurationSupport覆盖了@EnableAutoConfiguration里的所有方法,每个方法都需要重写继承并且WebMvcConfigurationSupport会让SpringBoot对mvc的自动配置失效。不过目前大多数项目是前后端分离,并没有对静态资源有自动配置的需求,所以继承WebMvcConfigurationSupport也未尝不可(不推荐,会导致一些莫名其妙的问题)。
6、使用场景
拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:
- 登录验证,判断用户是否登录。
- 权限检查:判断用户是否有权限访问资源,如校验token
- 日志记录:记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
- 性能检测:慢日志等记录时间的场景;