文章目录
目录
前言
大家好,今天给大家介绍一下SpringBoot的统一功能: 拦截器
1. 拦截器
1.1 什么是拦截器?
拦截器是Spring框架提供的核心功能之一,主要⽤来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码
也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户
请求前阻止其执行
在拦截器当中,开发人员可以在应⽤程序中做⼀些通用性的操作, 比如通过拦截器来拦截前端发来的,判断Session中是否有 请求用户的信息. 如果有就可以放行, 如果没有就进行拦截
1.2 拦截器的使用
拦截器的使用分为两步:
- 定义拦截器
- 注册配置拦截器
1.2.1 定义拦截器:
实现HandlerInterceptor接口,并重写所有方法
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");
}
}
-
preHandle()方法:在请求处理之前被调用,可以用于进行一些前置处理逻辑,如果返回true,则继续执行后续操作;如果返回false,则中断请求。
-
postHandle()方法:在请求处理之后、视图渲染之前被调用,可以用于进行一些后置处理逻辑。
-
afterCompletion()方法:在整个请求完成之后被调用,可以用于进行一些资源清理操作。
1.2.2 注册配置拦截器:
实现WebMvcConfigurer接⼝,并重写addInterceptors方法
@Configuration
public class WebConfig implements WebMvcConfigurer {
//⾃定义的拦截器对象
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册⾃定义拦截器对象
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表⽰拦截所
有请求)
}
}
1.2.3 拦截路径
拦截路径是指我们定义的这个拦截器, 对哪些请求生效. 我们在注册配置拦截器的时候, 通过 addPathPatterns() 方法指定要拦截哪些请求. 也可以通过 excludePathPatterns() 指定不拦截哪些请求
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/admin/**"); // 只拦截以/admin开头的路径
}
}
在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常见拦截路径设置:
拦截路径 | 含义 | 举例 |
/* | ⼀级路径 | 能匹配/user,/book,/login,不能匹配 /user/login |
/** | 任意级路径 | 能匹配/user,/user/login,/user/reg /book |
/* /book | 下的⼀级路径 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book /book |
/** /book | 下的任意级路径 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹 配/user/login |
1.2.4 拦截器执行流程
1. 添加拦截器后, 执行Controller的方法之前, 请求会先被拦截器拦截住. 执行 preHandle() 方法, 这个方法需要返回⼀个布尔类型的值. 如果返回true, 就表示放行本次操作, 继续访问controller中的 方法. 如果返回false,则不会放行(controller中的方法也不会执行).
2. controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及 afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.
总结
以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!