思路:
1、 首先就是我们登录成功的时候要返回两个token标识给前端,accessToken(权限认证token)和refreshToken(无感刷新token)
// 生成accessToken
String accessToken = tokenService.createToken(loginUser);
// 生成refreshToken
String refreshToken = tokenService.createRefreshToken(loginUser.getUsername());
2、前端将token保存起来
commit('SET_TOKEN', tokens[0])
commit('SET_REFRESH_TOKEN', tokens[1])
3、当accessToken过期的时候,会响应401,在前端响应拦截器中拦截到响应结果,然后带着refreshToken去发起请求,根据refreshToken生成新的accessToken返回给前端,再重新执行原请求
axios.get(process.env.VUE_APP_API_BASE_URL+process.env.VUE_APP_BASE_API+"/refreshToken", {
headers:{
refreshToken: getRefreshToken()
}
}).then(response => {
console.log(response)
if (response.data && response.data.code === 200){
//重新设置token
setToken(response.data.token);
isRelogin.show = false;
//刷新页面
location.reload();
}else{
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
location.href = '/index';
})
}).catch(() => {
isRelogin.show = false;
});
}
})
public AjaxResult refreshToken(HttpServletRequest request)
{
AjaxResult ajax = AjaxResult.success();
// 重新生成令牌
//从token中获取登录用户,再生成新的token存到redis,并且把token返回到前端
String refreshToken = request.getHeader("refreshToken");
String accessToken = tokenService.toRefreshAcesToken(refreshToken);
if (StringUtils.isNull(accessToken)){
return AjaxResult.error();
}
ajax.put(Constants.TOKEN, accessToken);
return ajax;
}