Spring Boot 自定义 Token 注解,实现接口鉴权 AOP 截器
在 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