前言:在进行中后台开发的时候,发现一些小问题,就是在用户已经登录,本地浏览器存入token的情况下,用户如果之间跳转到登录/login的路由,这时候是需要判断当前用户的token状态是否过期,如果过期了就停留在登录页面(login路由),如果没有过期,就跳转到首页的路由

实现的方法

前端我是设置了一个路由监听,如果当前的路由是Login,调用后端方法进行token的期限判断,如果没有过期就跳转到首页

路由监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 路由监听
router.beforeEach((to , from , next) =>{
const { setRouteName } = useState()
localStorage.setItem('currentRouteName', to.name as string)
// 设置当前路由
setRouteName()

// 如果当前路由是登录
if(to.name === 'Login'){
const token = localStorage.getItem('user') ? JSON.parse(localStorage.getItem('user') as string).token : ''
// 检查token是否过期
isExpiration(token).then(res =>{
// 如果token没有过期,之间跳到主控台
if(res.data){
next("/home/dashBoard")
}
})
}

// 未找到路由的情况
else if (!to.matched.length) {
const storeMenus = localStorage.getItem("menus")
if (storeMenus) {
next("/404")
} else {
// 跳回登录页面
next("/login")
}
}

else{
// 其他的情况都放行
next()
}

})

后端token过期验证

auth0 JWT库具有用于分析和(可选)验证令牌的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 校验token是否过期
*
* @param token 密钥
* @return 是否过期
*/
public static Boolean isExpiration(String token){
DecodedJWT jwt = JWT.decode(token);
if( jwt.getExpiresAt().before(new Date())) {
System.out.println("token is expired");
// 返回false,说明过期了
return false;
}else {
// 返回true,说明还没过期
return true;
}
}

验证token是否正确

这个可加也可不加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 校验token是否正确
*
* @param token 密钥
* @param sign 用户的密码
* @return 是否正确
*/
public static Boolean isToken(String token, String userId ,String sign) {
try {
//根据密码生成JWT效验器
Algorithm algorithm = Algorithm.HMAC256(sign);
JWTVerifier verifier = JWT.require(algorithm).withAudience(userId).build();
//效验TOKEN
DecodedJWT jwt = verifier.verify(token);
return true;
}
catch (Exception exception) {
return false;
}
}