一、SpringBoot拦截器介绍
Spring Boot中的拦截器是一种用于在处理请求之前或之后执行特定操作的组件。拦截器通常用于实现对请求进行预处理、日志记录、权限验证等功能。
在Spring Boot中,可以使用HandlerInterceptor
接口来定义自己的拦截器,并通过配置进行注册和使用。以下是使用拦截器的基本步骤:
- 创建一个实现了
HandlerInterceptor
接口的拦截器类,实现其中的方法,例如preHandle
用于在请求处理之前执行操作,postHandle
用于在请求处理之后执行操作,afterCompletion
用于在视图渲染之后执行操作。 - 在Spring Boot的配置类中,通过继承
WebMvcConfigurerAdapter
并重写addInterceptors
方法来注册拦截器。 - 在
addInterceptors
方法中,使用registry.addInterceptor()
来添加拦截器,并通过addPathPatterns
指定要拦截的路径模式,也可以使用excludePathPatterns
排除某些路径。 - 运行应用程序后,拦截器将根据配置的路径模式拦截相应的请求,并执行定义的操作。
二、用途
日志记录:拦截器可以在请求到达控制器之前或之后记录请求信息,如请求URL、请求参数、处理时间等,用于日志记录和统计。
权限验证:拦截器可以对用户的访问进行权限验证,比如判断用户是否登录、是否具有操作权限等。如果权限验证失败,拦截器可以返回相应的错误信息或重定向到登录页面。
请求参数处理:拦截器可以对请求参数进行预处理,如对参数进行校验、转换、加密等操作。这样可以减轻控制器的负担,使请求处理更加高效。
缓存管理:拦截器可以根据请求的路径或参数判断是否需要从缓存中获取数据,从而提高系统性能。
统一异常处理:拦截器可以拦截控制器方法的执行结果,对异常进行统一处理,如返回自定义的错误信息、记录错误日志等。
三、代码示例:
在 Spring Boot 项目中,使用拦截器功能通常需要以下 2 步:
- 创建拦截器;
- 配置拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)
1. 创建拦截器类:Interceptor
@Component
public class Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("进入拦截器了");
//中间写逻辑代码,比如判断是否登录成功,失败则返回false
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
//
System.out.println("controller 执行完了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("我获取到了一个返回的结果:"+response);
System.out.println("请求结束了");
}
}
2、拦截器注入适配器:InterceptorWebConfig
@Configuration
public class InterceptorWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new Interceptor())
.addPathPatterns("/**");//拦截所有
// .excludePathPatterns("/ayo/hhy1");
}
}
·····
代码解释说明:
- 通过实现
WebMvcConfigurer
接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter
来定义适配器,建议使用第一种,第二种已经是过时的方法了。 - 重写
addInterceptors
方法,addInterceptor
方法是将拦截器注入到适配器中。
3.addPathPatterns
方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
4.excludePathPatterns
是配置不需要拦截的路径。 - 需要加上
configuration
注解说明这是一个配置类,在项目启动的时候自动执行。
执行结果:
拦截器与过滤器的区别
归属不同:Filter
属于Servlet技术,Interceptor
属于SpringMVC
技术
拦截器内容不同:Filter对所有访问进行增强(在Tomcat
服务器进行配置),Interceptor
仅针对SpringMVC
的访问进行增强