简易权限切面用线程安全set存储需认证路径(如/api/user、/admin),请求时快速匹配并校验登录状态,未登录则拦截返回401;须统一路径格式、避免list遍历与正则匹配。

在简易权限切面模拟中,用 Set 集合拦截未认证访问,核心是把“需要认证才能访问的路径”提前登记进一个线程安全、查询高效的集合,然后在请求进入时快速判断当前路径是否在该集合中——若在且用户未登录,就直接拦截。
用 Set 存储受保护的路径列表
定义一个 Set<string></string>(推荐 ConcurrentHashMap.newKeySet() 或 Collections.unmodifiableSet(...)),预先加载所有需认证的接口路径,例如:
/api/user/profile/api/order/list/admin/dashboard
注意路径要统一格式:建议全小写、去除尾部斜杠、支持前缀匹配时额外处理(如 /api/ 可单独标记为需校验前缀)。
在切面中做快速路径匹配
使用 @Around 切面拦截 Controller 方法,提取请求路径(如通过 joinPoint.getSignature().getDeclaringTypeName() + 方法名,或更稳妥地从 RequestContextHolder 获取原始 URI):
- 若路径精确命中 Set 中某项 → 检查用户认证状态(如查看 Session 或 Token)
- 若未认证 → 直接返回 401 或重定向登录页,不执行原方法
- 若路径不在 Set 中 → 放行,不增加任何权限开销
避免常见陷阱
不要用 List 做查找:O(n) 遍历会随路径增多明显变慢;别忽略路径标准化:带参数的 /user?id=1 和静态路径 /user 应按规则归一化后再比对;慎用正则或模糊匹配:简易场景下优先走精确 Set 查找,复杂权限交给专门框架(如 Spring Security)。
一个轻量实现示意(伪代码)
```java
private static final Set
"/api/user", "/api/order", "/admin"
);
@Around("execution(* com.example.controller..*.*(..))")
public Object checkAuth(ProceedingJoinPoint joinPoint) throws Throwable {
String path = getCurrentRequestPath(); // 实际取法依 Web 环境而定
if (SECURE_PATHS.contains(path) && !isAuthenticated()) {
throw new UnauthorizedException("Access denied");
}
return joinPoint.proceed();
}











