用户在投稿页写了十几分钟,点提交弹出登录框,登录回来表单是空的,正文一个字都没留下,浏览器后退也只剩一个空白页。日志里能对上时间点,这种反而好排。

提交请求带着过期的会话,服务端把请求重定向到登录页,POST 数据在跳转里直接丢掉。前端没有本地草稿,页面又是整页刷新,内容就彻底没了。这一点先确认清楚,后面就不用反复试。

const form = document.querySelector('#post-form');
setInterval(() => {
  const data = Object.fromEntries(new FormData(form));
  localStorage.setItem('draft:' + location.pathname, JSON.stringify(data));
}, 5000);

这次卡住的地方就在「会话过期表单丢失」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。

处理上按这个顺序:表单输入时把内容定时写进 localStorage,按表单 id 分键,别用固定键;登录跳转前把当前地址和草稿标记一起带过去,回来能还原;服务端在会话失效时返回 401 而不是 302,让前端有机会先存草稿;拿一个过期会话手工提交一次,确认内容能回来。

结果对不对很好判断,会话过期后重新登录,回到投稿页正文还在,光标停在原来那段。

作者 9823189