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

版权声明:转载请注明地址,谢谢配合 https://blog.csdn.net/pulong0748/article/details/82559949

前言

     上一篇介绍了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实现缓存
     如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:coldStone,主要会分享分布式系统相关的一系列技术,目前会推出springboot、springcloud和docker系列教程,后期会有关于中间件以及各个层面的性能优化的文章,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!


猜你喜欢

转载自blog.csdn.net/pulong0748/article/details/82559949
今日推荐