Spring Boot实现HandlerInterceptor拦截器

HandlerInterceptor 是 Spring 框架提供的一个接口,用于拦截请求的处理过程,可以在请求处理前、请求处理后以及请求完成后进行相应的处理。它允许开发人员在请求进入控制器方法之前或之后执行一些额外的操作,比如日志记录、权限验证、请求参数预处理等。

HandlerInterceptor 接口包含三个主要的方法:

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在请求处理之前进行调用。该方法返回一个 boolean 值,表示是否应该继续处理该请求。如果返回 true,则继续执行下一个拦截器或处理器方法;如果返回 false,则中断执行链,不再执行后续的拦截器或处理器方法。

  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在请求处理之后、视图渲染之前进行调用。可以通过该方法进行一些后处理操作,比如对 ModelAndView 进行修改。

  3. 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 ";
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值