Spring Boot 自定义 Token 注解,实现接口鉴权 AOP 截器

望舒的头像
望舒
标签:
自定义注解请求拦截器springbootjavatoken鉴权

在 Web 应用开发中,为保障接口安全,通常需要对部分接口进行 Token 校验。本文将通过自定义注解 @Token 和 Spring AOP 实现接口鉴权逻辑,支持灵活配置与统一管理。

一、定义自定义注解 Token

通过注解方式标记需要验证的控制器方法,避免硬编码逻辑,增强可读性与扩展性。

复制
package com.xxx;

import java.lang.annotation.*;

@Documented
@Target({ElementType.METHOD}) // 标记在方法上
@Retention(RetentionPolicy.RUNTIME) // 保留到运行时
public @interface Token {
}

二、编写 Token 验证切面类

通过 AOP 实现统一的 Token 验证逻辑,提升代码复用与安全性。

复制
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
@Slf4j
public class TokenAop {

    // 定义切入点:拦截被 @Token 注解的方法
    @Pointcut("@annotation(com.xxx.Token)")
    public void pointCut() {}

    // 在方法执行前执行 Token 校验逻辑
    @Before("pointCut()")
    public void validateToken() {
        log.info("开始验证 Token...");

        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            throw new RuntimeException("无法获取请求上下文");
        }

        HttpServletRequest request = (HttpServletRequest)
            requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);

        String token = request.getHeader("Authorization"); // 或自定义 Header

        // 在这里添加你的 Token 验证逻辑
        // 比如验证 token 是否存在、是否有效、是否过期等
        if (token == null || !isValid(token)) {
            throw new RuntimeException("Token 无效或未提供");
        }
    }

    // 简单示例方法,实际可以连接 Redis 或数据库校验
    private boolean isValid(String token) {
        return "valid-token".equals(token); // 示例
    }
}

三、注解使用示例

在需要校验 Token 的控制器方法上添加 @Token 注解即可:

复制
@RestController
@RequestMapping("/api")
public class DemoController {

    @Token
    @GetMapping("/secure-data")
    public String getSecureData() {
        return "这是一段需要 Token 验证的数据";
    }
}

四、可选拓展:配合拦截器或过滤器使用

如果希望对所有请求进行基础 Token 拦截,也可结合 Spring 的 HandlerInterceptor 或 Filter 接口统一处理。但基于注解的方式更灵活,可按需控制是否校验。

通过自定义注解配合 AOP 切面,可以优雅实现接口 Token 验证逻辑,提升系统安全性与可维护性,适用于多数 Spring Boot 项目。

作者:https://blog.xn--rpv331d.com/望舒

链接:https://blog.xn--rpv331d.com/望舒/blog/11

转载注意保留文章出处...

‌‌‌‌‌​‌‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌​​‌​​‌‌‌​​​​​​‌‌‌‌​‌‌​‌‌‌​​‌‌‌‌​‌​​​​‌​‌​‌‌​​​‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌‌​‌​‌‌‌​​‌​​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌‌​‌​‌‌‌​​‌​​‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌​​‌​​​‌‌​‌‌​‌​‌​‌‌​‌‌‌​​​‌​​​‌​​​‌​​​​‌​‌​‌‌​​​‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌‌​‌​‌‌‌​​‌​​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌‌​‌​‌‌‌​​‌​​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌‌​​​​‌‌‌​​​​​​‌‌‌​​​​​‌‌​​​​​‌‌‌‌​‌‌​‌‌​​​​‌‌​​​‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌​​‌​​‌‌‌​​​​‌​​​​‌‌​​‌​‌‌​‌​‌​‌‌‌‌‌​‌​​‌‌‌​​‌​​​​​‌‌‌​​​​​‌‌​​​​​‌‌‌​‌‌​‌‌‌​​​​​‌‌‌‌‌​‌‌​​​​​​‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌‌‌‌‌​‌‌​‌‌​‌​‌‌
1
0
0
122
No data