HandlerInterceptor 是 Spring 框架提供的一个接口,用于拦截请求的处理过程,可以在请求处理前、请求处理后以及请求完成后进行相应的处理。它允许开发人员在请求进入控制器方法之前或之后执行一些额外的操作,比如日志记录、权限验证、请求参数预处理等。
HandlerInterceptor 接口包含三个主要的方法:
-
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在请求处理之前进行调用。该方法返回一个 boolean 值,表示是否应该继续处理该请求。如果返回 true,则继续执行下一个拦截器或处理器方法;如果返回 false,则中断执行链,不再执行后续的拦截器或处理器方法。
-
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在请求处理之后、视图渲染之前进行调用。可以通过该方法进行一些后处理操作,比如对 ModelAndView 进行修改。
-
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整个请求完成后(包括渲染视图后)进行调用。可以在这里进行一些资源清理操作或者记录日志。
通常情况下,HandlerInterceptor 用于实现一些横切关注点,比如日志记录、权限验证、请求参数预处理等。通过实现该接口,开发人员可以方便地在不同的处理阶段插入自定义的逻辑,从而实现更灵活、可扩展的请求处理流程。
1、配置拦截器类
/**
* @author Lucas
* date 2024/3/28 21:00
* description 配置拦截器类
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor())
//拦截所有
.addPathPatterns("/**")
//指定放行
.excludePathPatterns("/favicon.ico")
.excludePathPatterns("/user/login");
}
}
2、拦截器类
/**
* @author Lucas
* date 2024/3/28 21:02
* description 拦截器类
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String accessToken = request.getHeader(Constant.ACCESS_TOKEN);
Assert.notNull(accessToken,"请求头Token信息不存在,请检查");
Assert.isTrue(accessToken.startsWith(Constant.BEARER),"请传递正确的token信息");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//可对ModelAndView进行修改
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//有使用ThreadLocal可在这remove避免OOM内存溢出
}
}
3、常量类
/**
* @author Lucas
* date 2024/2/16 10:19
* description 常量类
*/
public interface Constant {
/**
* token请求头
*/
String ACCESS_TOKEN = "Authorization";
/**
* token前缀
*/
String BEARER = "Bearer ";
}