实习初期:环境与流程
进入公司后,项目处于启动期,我参与了基础模块的开发。入职前几日主要是环境搭建和熟悉规范。
- 基础配置:开通飞书、邮箱等办公权限。
- 代码拉取与环境:使用 Git/SVN(阿里云云效)克隆项目,配置前后端开发环境。重点解决依赖问题,确保项目能跑起来。
- 工具熟悉:Mentor 指导了 Debug 技巧和快捷键,避免操作层面的时间浪费。
接下来的一两周是深度熟悉阶段。任务包括梳理目录结构、理解数据库设计、熟读 Common 通用包,以及掌握 Git 和 MyBatis-Plus 的使用。通过编写简单 Demo 验证对框架的掌握程度,并尝试寻找少量 Bug 提交审核。
核心模块实战
权限管理模块
权限校验是企业系统的基石。我们采用了自定义注解配合 AOP 切面的方式。
首先定义一个 Auth 注解,标记需要权限校验的方法:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Auth {
String[] value() default "";
}
接着实现 AuthAspect 切面,拦截标注了 @Auth 的方法。这里利用 Spring AOP 的 @Pointcut 表达式 @annotation(auth) 精准定位目标方法,并将注解实例注入参数中供后续逻辑使用。
在 aroundAuth 通知中,我们获取当前登录用户信息,提取角色并校验是否包含在注解定义的权限列表中。如果校验失败,直接抛出业务异常;如果成功,则放行请求。值得注意的是,这里还处理了参数注入的逻辑,确保用户上下文能自动传递给业务方法。
除了注解切面,我们还实现了 LoginFilter 过滤器作为请求入口的第一道关卡。初始化阶段会将白名单 URL 解析为 PathPattern 缓存,避免每次请求都重复解析。核心过滤逻辑 doFilter 会判断请求是否命中白名单,未命中的请求进入认证处理流程。
认证处理分为普通用户和 OpenAPI 两种场景。对于普通用户,从 Header 解析 Token 并校验;对于 OpenAPI,则校验 API Key 和版本头。无论成功与否,最终都会在 finally 块中清理用户上下文,防止内存泄漏。
Token 管理与会话控制
Token 服务采用 JWT + Redis 的组合方案。JWT 负责无状态签名,Redis 负责存储用户状态以实现主动失效。
创建 Token 时,生成 UUID 作为唯一标识,构建 Claims 载荷,使用 HS512 算法签名,并将用户信息存入 Redis,Key 格式为 LOGIN_USER:{tokenId}:{username},设置过期时间与 Token 一致。
刷新 Token 是一个容易出问题的环节。当检测到剩余有效期不足 30 分钟时,系统会生成新 Token 并更新 Redis 中的过期时间。关键点在于必须同时使旧 Token 失效。我们在续期逻辑中增加了 invalidateOldToken 调用,解析旧 Token 获取其 ID 和用户名,构造对应的 Redis Key 并删除,彻底禁用旧令牌,避免同一账号多 Token 有效带来的安全风险。
业务实战:企业模块
在企业 CRUD 操作中,缓存策略至关重要。
以全量数据查询为例,我们采用了双重校验加锁的模式来防止缓存击穿:
public List<Company> cacheAll {
;
List<Company> cachedList = redisService.get(cacheKey, List.class);
(cachedList != ) {
cachedList;
}
(cacheLock) {
cachedList = redisService.get(cacheKey, List.class);
(cachedList != ) {
cachedList;
}
List<Company> list = list();
redisService.set(cacheKey, list, );
list;
}
}


