后台编辑写了一半去开会,回来点保存直接跳到 419 页面,写的内容全没了。同一个账号新开一个标签页提交又是正常的。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,CSRF 令牌跟着会话走,会话过期或重新登录后旧令牌就失效了。页面上的令牌是首次渲染时写死的,长时间停留不会自动更新。
碰到「CSRF token 过期」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。改完顺手把文档补一句,省得下次自己重新推一遍。
const { token } = await fetch('/csrf-token').then(r => r.json());
await fetch('/save', {
method: 'POST',
headers: { 'X-CSRF-Token': token },
body: formData,
});
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,提交前先请求刷新令牌的接口,拿到新值再发保存请求;419 时不要整页跳转,弹提示并把内容留在本地草稿;把会话有效期调长,或在页面里定时续期。
最后用这个标准收尾,页面停留两小时后再保存,请求返回 200,内容正常入库,不再出现 419。
