请求封装和登录过期怎么处理
先理解原理和示例,再练习完整口述与追问。
回答要点
说明基础请求层、业务 API 层和页面的职责;统一处理认证、超时、取消、公共错误,页面决定业务反馈。刷新 token 时考虑并发请求只触发一次刷新,以及刷新失败后的退出流程。
原理拆解
请求封装应统一协议行为,而不是吞掉业务差异。公共层处理认证头、超时、取消和错误格式;API 层定义 endpoint 与参数;页面决定表单报错、局部重试或导航。并发 401 的关键是所有请求等待同一个刷新任务,而不是每个请求各刷新一次。刷新成功后替换凭据并最多重放一次,刷新失败则统一结束等待者并清理会话。
示例与推演
可以把刷新状态表示为 refreshPromise:第一个需要刷新者创建 Promise,后来的请求复用它,finally 再清空。重放请求携带 retried 标记,防止反复刷新;刷新 endpoint 走不触发同类拦截的通道。SSR 中该状态必须限制在当前请求或正确用户会话内,不能把一个模块级用户 token 共享给所有访问者。
易错点
不要对支付、创建订单等写请求无条件重放。401、403、网络异常和业务校验失败分别处理;抛出原错误或结构化错误,不能把失败 resolve 成空数组,让页面误以为查询成功。
参考回答可直接练习口述
我把请求层、业务 API 和页面分开:请求层负责基础配置、认证头、超时取消及公共错误,API 层表达具体业务接口,页面负责加载态与交互。token 过期时用共享的刷新 Promise 合并并发刷新,其他请求等待同一次结果;成功后按规则重放一次,失败则清理认证并统一跳登录。刷新接口自身不能再触发刷新,防止死循环。写操作重放要先确认幂等或服务端未执行,不能一律重试。
面试官可能继续问追问与完整解答展开收起
追问
如何避免重复提示?哪些失败可以重试?非幂等写入能否直接重试?SSR 从哪里拿认证信息?
追问回答
公共错误由请求层或统一提示入口负责一次,页面只补业务反馈,避免重复 toast。网络瞬断等可按幂等策略有限重试;写操作需要幂等键或确认服务端未执行。SSR 从请求 Cookie/headers 等取得认证,只向可信目标转发必要信息。