springboot入门系列教程|第八篇:springboot实现自定义拦截器以及自定义注解

前言

     上一篇介绍了springboot结合redis的使用案例,这篇主要介绍springboot实现自定义拦截器配合注解使用,很有用的一篇文章哦。
     环境准备:

jdk 8
IDEA
maven 3.3.9

     项目搭建:

     目录结构

**案例场景:**现在我需要对部分用户进行拦截,通过注解的方式,假如有这么一个注解@tokenAuth,只要他放在方法上,那么请求都不需要带token,假如没有请求没有带token,那么请求方法将会失败。

     第一步:编写拦截器


@Component
public class TokenInterceptor extends HandlerInterceptorAdapter {
    public TokenInterceptor() {
        super();
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 免token注解
        IgnoreAuth ignoreAuth;
        //1: 判断是否方法级别的
        if(handler instanceof HandlerMethod) {
            ignoreAuth = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
        } else {
            // 如果不是方法级别的
            return true;
        }
        if(ignoreAuth != null){
            // 有注解,则不验证token
            return true;
        }
        //2:header中拿token
        String token = request.getHeader("token");
        if(StringUtils.isBlank(token)){
            // 没有从request中拿
            token = request.getParameter("token");
        }

        //3:token为空
        if(StringUtils.isBlank(token)){
            System.out.println("token 为空,无法通过拦截器");
            return  false;
        }

        //下面两步省略,自己可以创建一个简单用户表,然后里面设置token 信息
        //4:查询token信息 没查到抛出token无效信息

        //5:设置userId到request里,后续根据userId,获取用户信息

        //return  true表示通过了拦截器 可以执行下面的操作
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }
    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        super.afterConcurrentHandlingStarted(request, response, handler);
    }
}

     第二步:编写配置类


@Configuration
public class WebConfig implements WebMvcConfigurer {

    //将tokenInterceptor放入到spring容器中管理
    @Autowired
    public TokenInterceptor tokenInterceptor;

    /*实现此方法添加拦截器
    * addPathPatterns  拦截路径
    * excludePathPatterns() (不拦截的路径数组) 我这个demo没有使用
    * */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截路径,表示此路径下的所有地址都会先执行此拦截器,通过之后才能访问Controller
        String[] addPathPatterns = {
          "/token/*"
        };
        registry.addInterceptor(tokenInterceptor).addPathPatterns(addPathPatterns);
    }
}

     第三步:编写注解类



/*
表明这个注解应该被 javadoc工具记录
@Documented

作用于方法级别
@Target(ElementType.METHOD)

这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
@Retention(RetentionPolicy.RUNTIME)
* */


@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreAuth {
}

     第四步:编写controller类

@RestController
@RequestMapping("/token")
public class Controller {

    @RequestMapping("/interceptor")
    public  String  testInterceptor(){
        return "恭喜你通过了拦截器来到了这里";
    }
}

     测试如下:

          一:不带token

localhost:8080/token/interceptor

          执行结果:

token 为空,无法通过拦截器

          二:带token

localhost:8080/token/interceptor?token=coldStone

          执行结果:

恭喜你通过了拦截器来到了这里,我的微信公众号是coldStone

     这样我们便成功的通过拦截器里的方法去判断用户请求是否带token,而做出相应的响应。

     源码地址:spring-boot-web
     上一篇:springboot结合redis实现缓存

如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:java架构师小密圈,会分享架构师所必须深入研究的技术,比如netty,分布式,性能优化,spring源码分析,mybatis源码分析,等等等,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!
公众号:分享系列好文章
java架构师小密圈

交流群:群友互相分享资料
java架构师小密圈

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mindcarver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值