• springboot项目使用拦截器和注解方式验证token



    本文使用注解标注需要验证token的contoller,使用拦截器验证token

    注解代码TokenCheck

    用于标注需要验证token的contoller

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TokenCheck {
        boolean required() default true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    用于controller代码

    直接在方法上加上@TokenCheck

    @PostMapping("/edit")
        @TokenCheck
        public ResultWrapper edit(@RequestBody UmsMember umsMember){
            System.out.println("执行了edit");
            return umsMemberService.edit(umsMember);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建一个token异常

    用于捕获异常

    public class TokenException extends Exception {
        public TokenException(String message) {
            super(message);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用拦截器对这个token进行验证

    public class AuthInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response,
                                 Object handler) throws Exception {
    
            System.out.println("进入了拦截器");
    
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            // 判断方法中是否有tokencheck注解
            if (method.isAnnotationPresent(TokenCheck.class)){
                // 获取token注解
                TokenCheck annotation = method.getAnnotation(TokenCheck.class);
                // 判断token默认值
                if (annotation.required()){
                    // 获取请求token
                    String token = request.getHeader("token");
                    // 判断token是否为空
                    if (StringUtils.isNullOrEmpty(token)){
                        // 是的话抛出token异常
                        throw new TokenException("token 为空");
                    }
                    // 解析token
                    try {
                        JwtUtil.parseToken(token);
                    } catch (Exception e){
                        throw new TokenException("token 异常");
                    }
    
                }
                return true;
            }
    
            return false;
    
    
    
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    将拦截器注册到mvc配置中

    @Configuration
    public class AuthInterceptorConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    对token异常进行捕获

    这部分就可以再全局异常捕获代码中添加就行了

    @RestControllerAdvice
    public class GlobalHandler {
    
        @ExceptionHandler(ArithmeticException.class)
        public ResultWrapper globalHandle(Exception e){
            return ResultWrapper.builder().code(501).msg(e.getMessage()).build();
        }
    
        @ExceptionHandler(TokenException.class)
        public ResultWrapper tokenCheckHandler(Exception e){
            return ResultWrapper.getFailBuilder().code(501).msg(e.getMessage()).build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果展示

    在这里插入图片描述

  • 相关阅读:
    【机器学习】强化学习算法的优化
    Python 使用PIL读取图像自动旋转exif信息
    Spring——Spring核心基于注解方式的DI实现IoC的设计思想-搭建三层架构项目样例
    redis集群
    【Nearest Plane Algorithm】
    【软考软件评测师】第六章节 可靠性测试测试方法
    一天梳理完react面试高频知识点
    c 语言基础:L1-047 装睡
    关于IDEA的Spring boot项目创建慢,Maven插件加载慢,依赖导入慢或者失败的原因及解决方案
    《Spring入门基础》
  • 原文地址:https://blog.csdn.net/weixin_47402482/article/details/127698268