前端无痛刷新(无感刷新)

问题引入

用户在做一些操作时,可能由于token过期而导致用户需要重新登录才能进行后面的操作。这是为了接口数据的安全考虑,后端会对token设置一个过期时长,而token过期的话用户就需要重新的登录才能操作特殊的操作,会对用户不太友好。这时就需要使用无痛(无感)刷新了。

实现思路:

在响应拦截器中根据过期token调用登录刷新token值。

 实现代码:

//将需要携带token的请求存放进数组中
const METHOD_TYPE = ["_mt=edit","_mt=create","_mt=delete"];
//添加响应拦截器
instance.interceptors.response.use(async function(response){
    let data = response.data
    let {errmsg,errno} = data;//解构出我们所需要的数据
    if(10006===errno){
        //获取接口请求数据
        let configData = response.config.data || "";//获取登录时的请求方法和参数
        //请求类型是否为无痛刷新 index !== -1需要刷新令牌
        var index = METHOD_TYPE.findIndex(item=>configData.includes(item));
        if(-1 === index){//需要重新登录获取令牌
            router.replace({
                path:"/logins",//跳转到登陆页面
                query:{back:path}//登录之后回到跳转前的页面,优化用户体验
            })
            return;
        }else{
            let store = useUserstore();//这是是使用pinia如不使用可以替换成临时存储或永久存储
            let {username,password} = store.loginInfo;
            //重新获取令牌
            let loginData = {_gp: "admin",_mt: "login",username,password}
            let {errno,errmsg,data} = await post(loginData);//同步请求
            if(200==errno){
                jsCookie.set("token",data);//保存令牌到cookie
            }else{
                router.replace({
                    path:"/logins",
                    query:{back:path}//登录之后需要跳回地址,优化用户体验
                })
                return Promise.reject({errno,errmsg,data});
            }
            //重新发送上次的请求
            return instance.request(response.config)
        }
    }
    return data;
},function(error){
    return Promise.reject(error)
})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题涉及到前端中的认证和授权问题,以及如何在前端中处理 token 刷新的问题。 认证和授权是指用户在访问系统资源时需要进行身份验证和权限验证。前端通常会在用户登录后返回一个 token,然后在每次请求时将 token 带上,服务端会通过 token 来判断用户是否有权限访问资源。 在使用 token 进行认证和授权时,由于 token 有一定的有效期限制,因此需要在 token 过期前进行刷新。在前端中可以通过定时器来定时检查 token 的有效期,当 token 即将过期时,发送一个刷新 token 的请求,获取新的 token,然后将新的 token 存储在本地,同时更新请求头中的 token。 以下是一个示例代码: ```javascript // 定义定时器,每隔一段时间检查 token 是否即将过期 let timer = setInterval(() => { let token = localStorage.getItem('token') let expiredTime = localStorage.getItem('expiredTime') if (new Date().getTime() > expiredTime - 60000) { // token 即将过期 refreshToken(token) } }, 1000) // 刷新 token 的函数 function refreshToken(token) { // 发送请求获取新的 token axios.post('/refreshToken', {token: token}) .then(res => { // 更新本地存储的 token 和过期时间 localStorage.setItem('token', res.data.token) localStorage.setItem('expiredTime', new Date().getTime() + res.data.expiresIn * 1000) // 更新请求头中的 token axios.defaults.headers.common['Authorization'] = 'Bearer ' + res.data.token }) } ``` 需要注意的是,当用户退出登录时,需要及时清空本地存储的 token 和过期时间,并停止定时器。 ```javascript function logout() { localStorage.removeItem('token') localStorage.removeItem('expiredTime') clearInterval(timer) } ``` 总之,前端刷新 token 的主要思路就是定时检查 token 的有效期,当即将过期时发送一个刷新 token 的请求,获取新的 token,然后更新本地存储的 token 和过期时间,并更新请求头中的 token。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值