百特云享Java后端日常实习复面面经
《面试题目》
项目相关
- 请介绍用Java做的两个项目,包括主要功能、亮点工作及实现逻辑。
- 项目的登录方式是什么?如何实现登录?
- 智能体是调用现成的吗?是自己做的还是基于别人的平台/开源项目开发的?
技术细节
- 从输入用户名密码点击登录,到跳转页面后访问其他页面,JWT登录的完整流程(token生成、校验过程)是怎样的?
- 拦截请求的方式是什么?拦截器在什么时候注册?
- 如何考虑Redis锁的过期时间和业务执行逻辑的关系?
- 使用Redis锁时用的是什么框架?
- Redis的基础数据结构有哪些?
- 了解Java中的stream流吗?
- 学习或实习过程中是否接触、使用过并发编程?
- SQL中inner join和left join有什么区别?
- 了解联合索引吗?
- 若需实现“用户多设备登录时,最后一次登录的设备在线,其他设备登录token失效”,该如何实现?
- 了解Spring事务吗?
《参考解析》
- JWT登录流程:登录验证成功后,服务端根据用户标识生成加密的JWT字符串返回客户端;客户端将其存入LocalStorage或Cookie,后续请求在Header中携带该Token;后端通过拦截器获取Token并校验签名及有效期。
- Redis锁与过期时间:过期时间应略大于业务最大预估执行时间,防止业务执行过慢锁提前释放;建议采用“看门狗”机制,在锁即将过期时自动延长有效期。
- 多设备登录排他逻辑:可以在Redis中以用户ID为Key,当前设备的Token为Value进行存储。用户登录时更新该Key的值,校验请求时对比请求头的Token与Redis中的是否一致,不一致则拒绝访问。
- Inner Join vs Left Join:Inner Join只返回两个表中连接字段匹配的行;Left Join则返回左表所有行,右表若无匹配则补NULL。
- 联合索引:遵循最左匹配原则,查询时必须包含索引的最左侧字段才能触发。在设计时,应将区分度高、查询频繁的字段放在左侧。