在vue后台管理系统场景下,不同的用户有不同的权限

在Vue后台管理系统中,当用户切换账号时,由于单页面应用特性,localStorage的token值未及时更新,导致权限界面显示错误。解决方法包括使用location.href刷新页面或监听并重构localStorage.setItem事件,确保每次请求携带最新的token。

在用户第一次使用普通管理员账号登录成功之后返回的数据里面有token字段,本地存储token字段

  • 如果他返回登录页,使用另外一个超级管理员的账号再次登录,还是会返回token字段,重新设置localStorage存储的token
  • 可以看到,浏览器里面的token字段已经更新,但是因为是单页面应用,跳转路由进入首页之后,fetch.js里面封装的http方法获取到的localStorage还是上次的token字段
    原因:单页面应用只有reload,js才会刷新, 页面不刷新js不会重新获取localStorage的值,这个字段就不会更新,所以用户看到的仍然是上次登录的权限界面。为了解决这个问题,有以下2种解决办法:
  1. location.href = ‘/home’ 使用location.href跳转页面,可以刷新页面
  2. window全局监听localStorage的setItem保存token字段时的事件
    重构setItem,在setItem里面修改localStorage值时,派发一个事件,window全局监听,值发生改变就立即触发监听函数,改变对象的值
    tools.js里面封装dispatchEventStroage函数并抛出
    function dispatchEventStroage () {
    const signSetItem = localStorage.setItem
    // 重构setItem
    localStorage.setItem = function (key, newValue) {
    // 实例化自定义事件
    let setEvent = new Event(‘setItemEvent’)
    // 设置key值和value
    setEvent.key = key
    setEvent.newValue = newValue
    // 当setItem加小括号调用执行时,dispatchEvent触发window全局的setItemEvent事件执行
    window.dispatchEvent(setEvent)
    signSetItem.apply(this, arguments)
    }
    }
    // main.js引入toos.js文件,调用执行
    tool.dispatchEventStroage()
    // fetch.js里面封装的http请求数据方法
    // 为了安全和权限验证,使用JWT技术,每次请求都需要携带token字段
    const reqHeaders = {
    Accept: ‘text/json’,
    token: localStorage.getItem(‘token’) || ‘’
    }
    window.addEventListener(‘setItemEvent’, function(e) {
    reqHeaders.token = e.newValue
    })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值