答辩老师问的技术问题其实高度集中。他们不关心你用了什么花哨的库,关心的是你有没有想过"为什么",以及你说的和你做的是不是一回事。下面 15 个问题是前后端分离项目(Spring Boot / Node / Python + Vue3 + MySQL)答辩里出现频率最高的,每个给一句话答法、一个展开点、一个能当场演示的动作。
演示比解释有说服力。能演示的尽量演示。
一、认证
1. 为什么用 JWT 不用 Session?
一句话:无状态,后端不用存登录状态,多个实例谁来都能验,也不依赖 Redis。
展开:Session 要在服务端存会话、要处理分布式共享;JWT 把用户标识签在 Token 里,后端只验签。
演示:登录后在浏览器 Application 面板里看localStorage的 accessToken,用 jwt.io 解出sub、username、type、exp。
2. 为什么要两个 Token?
一句话:accessToken 短命(2 小时)降低泄露风险,refreshToken 长命(7 天)让用户不用频繁登录。
展开:accessToken 过期时前端用 refreshToken 换新的一对,用户无感知;两个 Token 用type字段区分,refreshToken 不能当 accessToken 用。
演示:把 accessToken 改坏,刷新页面,Network 里看到 401 → refresh → 重放。
3. 多个请求同时过期,会刷新多次吗?
一句话:不会,用一个"正在刷新"标记加请求队列,只刷新一次,其余排队等新 Token。
演示:改坏 Token 后刷新首页,首页同时发三个请求,Network 里refresh只出现一次。
4. refreshToken 不落库,怎么让它失效?
一句话:禁用用户即可让刷新失败;需要主动作废可以加 Token 黑名单表,这是扩展方向。
展开:这是"简单优先"的取舍,答辩时主动说出取舍比被问出来好。
5. 密码怎么存的?
一句话:bcrypt 哈希,不可逆,每次加盐,永不返回给前端。
演示:数据库里sys_user.password是$2a$10$开头的 60 位字符串;接口返回的用户信息里没有 password 字段。
二、权限
6. 权限是前端做的还是后端做的?前端隐藏按钮安全吗?
一句话:两处都做。前端隐藏按钮只是体验,后端每个写接口都校验权限码,绕过前端会得到 403。
演示:用普通账号登录,页面没有新增按钮;打开 Swagger 用同一账号调新增接口,返回{ "code": 403, "message": "没有操作权限" }。这是全场最值得做的演示。
7. RBAC 是什么?和直接给用户配权限有什么区别?
一句话:权限先给角色,角色再给用户;直接给用户配(ACL)人多了没法维护。
展开:用户—角色—菜单控制页面,角色—权限点控制按钮和接口,用户不直接挂权限。
8. 菜单和按钮为什么分两张表?
一句话:菜单回答"能进哪个页面",权限点回答"能做什么操作",职责单一。
展开:很多框架把按钮当 type=3 的菜单放一张表,能用但讲不清;拆开后权限点只由 SQL 维护,前端按钮、后端注解、数据库记录三处对齐更容易。
9. 权限改了要重新登录吗?
一句话:不用,后端每次请求重新查权限码;前端权限在下次刷新页面后更新。
展开:每请求查库是教学优先的取舍,高并发可以缓存,作为扩展方向。
10. 超级管理员的权限存在哪?
一句话:不存,按角色编码admin特判放行;返回给前端的是通配符*:*:*。
展开:好处是新增菜单或权限点不用给管理员补授权,也避免误删关联表导致管理员失权。
三、接口与分层
11. 你的接口返回格式是统一的吗?错误怎么处理?
一句话:统一{ code, message, data },code 为 0 成功;失败时 HTTP 状态码与 code 相同,400 参数或业务错误、401 未登录、403 无权限、404 不存在、500 服务器错误。
演示:调一个不存在的 ID,返回 404 和中文 message;提交空表单,返回 400 和第一条校验提示。
12. 一次"点击新增"从前端到数据库经过哪些文件?
一句话:页面 → 接口封装(加 Token)→ 后端认证过滤器 → 权限拦截器 → 日志切面 → Controller 参数校验 → Service 业务规则 → Mapper → 数据库,再一路返回。
展开:能按顺序说出每一层的文件名,就是"分层"这个词最好的证明。
13. Controller 和 Service 的职责怎么分?
一句话:Controller 只做三件事:声明权限码、声明日志、把参数交给 Service 并包装返回;业务判断全在 Service。
演示:打开任一 Controller,方法体只有一两行。
四、数据库
14. 这张表为什么不建外键?
一句话:看业务。用户被删除后,他发布的公告、上传的文件、操作日志应该保留,所以这些表的用户 ID 不建外键;角色—菜单这类纯关联表建外键并级联删除。
展开:能说出"哪些建、哪些不建、为什么",比"全建"或"全不建"都好。
15. 表结构是代码自动生成的还是 SQL 写的?
一句话:SQL 是唯一事实来源,ORM 不自动建表;每张表每个字段都有中文注释。
展开:自动建表的结果在不同 ORM 里有细微差异(类型、索引名),统一用 SQL 才能保证一致;SQL 文件本身就是数据库设计文档。
答辩前怎么用这份清单
- 每个问题先自己答一遍,答不出的去代码里找对应文件,找不到说明项目里确实缺这块;
- 把能演示的 5 个动作(解 Token、改坏 Token 刷新、普通账号 403、404 与 400 的返回、Controller 只有一两行)提前在自己电脑上做一遍,确认环境没问题;
- 主动说取舍。“refreshToken 不落库”“每请求查库"这类点,自己先说"这是简单优先的取舍,扩展方向是……”,比被问出来好得多。
我是蓝象,关注“跑起来 → 看得懂 → 改得动 → 讲得清”。想继续了解我们的项目实战服务,可以查看👉 蓝象官网。