点击图片不刷新主因是浏览器缓存URL,需在src后拼随机参数(如?t=Date.now())强制发起新请求,同时确保前后端验证码同步更新。
点击图片不刷新?多半是浏览器缓存了请求
直接给 <img> 绑 onclick 但没效果,本质是浏览器把 src 当作静态资源缓存了。哪怕后端接口每次生成新图,前端发的仍是同一个 url,浏览器就直接返回缓存副本。
- 最简解法:在图片 URL 后拼一个无意义但变化的参数,比如
Math.random()或new Date().getTime() - 别用
location.reload()或整页刷新——用户刚输的表单内容全丢 - 如果后端接口带 query 参数(如
/admin/verify?t=xxx),确保这个参数参与缓存键计算,否则 Nginx 或 CDN 可能仍缓存
Layui 中 img 标签怎么写才支持点击刷新
关键不是加什么 class,而是控制 src 属性动态更新。Layui 本身不接管 <img> 行为,得自己写 JS 绑定。
- HTML 里给
<img>加个唯一 ID,比如id="captcha-img",方便 JS 定位 - 初始
src写成src="{:url('/admin/verify')}"(ThinkPHP 模板)或src="/admin/verify"(纯静态) - 不要写
onclick="this.src=this.src"这种死循环写法——它只是重复赋值旧 URL,没加随机参数 - 推荐写法:
<img id="captcha-img" src="/admin/verify?r=1" onclick="refreshCaptcha()">,再配独立函数
刷新时如何避免验证码校验失效
前端换图、后端换码,必须同步。常见错误是只刷新图片,但 session 里的 code 没更新,导致用户输对了也提示错误。
- 每次点击刷新,必须触发一次后端接口调用(哪怕只是 GET),让服务端重生成并存入 session
- 后端接口(如
/admin/verify)必须做两件事:生成新验证码字符串、写入req.getSession().setAttribute("code", code)(Java)或session(['captcha' => $code])(TP6) - 前端不用主动传参给后端——URL 上的随机参数(如
?t=1720072200123)仅用于破缓存,后端忽略即可 - 如果用 AJAX 预加载新验证码,注意别在用户还没点之前就提前覆盖 session,否则“换图前输的旧码”反而失效
注册提交后要不要自动刷新验证码
要,但得在表单校验失败时才刷,而不是每次提交都刷。否则用户输对了验证码却因密码格式错被拒,再点提交时验证码已变,体验极差。
- 在 layui
form.on('submit(...)')的回调里判断响应状态:如果后端返回code !== 200(如验证码错误、用户名已存在),再执行$('#captcha-img').attr('src', '/admin/verify?' + Date.now()) - 别在
success回调里刷新——登录成功后页面通常跳转,刷了也没用 - 如果注册接口返回了新验证码字段(如
{"code":400,"msg":"验证码错误","new_captcha":"/admin/verify?t=xxx"}),可直接用返回值更新src,更精准











