如何让密码过期提醒alert弹窗在登录流程中仅触发一次
问题根因
你现在的密码过期alert会触发3次,是因为提醒逻辑被放在了登录流程三个都会执行的渲染/逻辑节点上,代码每跑到对应节点就会执行一次alert,没有做单次触发的拦截。
解决方法
核心做两件事:
- 给提醒逻辑加单次执行的标记,保证同一次登录流程里只会触发一次
- 把提醒代码从三个触发节点全部移除,只放到你选定的触发时机(首次登录后/登录确认时)的对应位置
推荐用sessionStorage做标记存储:它的生命周期和当前标签页绑定,同一次登录流程里标记不会丢失,关闭标签页后自动清除,下次登录还能正常触发提醒,不会出现永久不弹的问题。
可直接复用的代码
先把公共逻辑抽出来,替换你原来的pwdDaysToExpire相关代码:
function pwdDaysToExpire() { const userData = getStoredUserData(); const { pwdLastSet } = userData; const datepwdLastSet = new Date(pwdLastSet).getTime(); const dateNow = new Date().getTime(); const diffInDays = Math.ceil((dateNow - datepwdLastSet) / (1000 * 3600 * 24)); return diffInDays; } function triggerPwdExpireAlert() { // 已经弹过直接终止逻辑 if (sessionStorage.getItem('pwd_alert_shown') === '1') return const leftDays = 90 - pwdDaysToExpire() if (pwdDaysToExpire() >=76 && leftDays > 0) { alert(`YOUR PASSWORD WILL EXPIRE IN ${leftDays} DAYS`) // 标记已弹出,后续不会再触发 sessionStorage.setItem('pwd_alert_shown', '1') } }
触发时机配置
- 选首次登录后触发:找到首次登录成功、拿到用户信息后的回调函数,在里面加一句
triggerPwdExpireAlert()即可,另外两个登录流程节点不要放这段调用 - 选登录确认时触发:找到用户点击登录确认、账号密码校验通过、即将跳转系统主页前的逻辑位置,在里面加
triggerPwdExpireAlert(),其余节点删除相关代码
补充:如果你需要用户每天第一次登录才弹一次、跨标签页也不重复弹,可以把
sessionStorage换成localStorage,存储标记的时候带上当天日期,日期不匹配才触发提醒即可。
内容的提问来源于stack exchange,提问作者displayName
相关产品推荐
相关产品推荐

