Laravel表单校验提示Expired token 提交后返回仍显示旧数据如何解决
你对CSRF防护的作用存在认知偏差,CSRF仅用于拦截跨站点的恶意伪造请求,和浏览器后退时展示已提交表单数据的行为完全无关,该现象是浏览器默认的页面缓存机制导致的。
对应解决方案如下:
方案1:服务端禁用表单页缓存(推荐优先使用)
在返回表单视图的index方法中添加缓存控制响应头,强制浏览器每次访问表单页都从服务端拉取最新内容,不会在本地缓存页面状态:
function index(){ return response() ->view('recette') ->header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') ->header('Pragma', 'no-cache') ->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT'); }
方案2:前端兜底清空表单
在表单页的前端代码中加入JS逻辑,监测到页面是通过后退操作加载时,自动重置表单清空内容:
window.addEventListener('pageshow', function(e) { // 识别后退/缓存加载场景 const isBackLoad = e.persisted || (window.performance?.navigation?.type === 2); if (isBackLoad) { document.querySelector('form').reset(); } });
两个方案搭配使用可以覆盖绝大多数浏览器场景,完全避免用户后退看到已提交的表单内容。
内容的提问来源于stack exchange,提问作者forcela
相关产品推荐
相关产品推荐

