java 微信小程序使用 jwt token如何刷新token过期时间如何更换token保持请求发送成功后前端为uniapp怎么重新发送请求服务端怎么返回特定错误码详细代码
- 刷新Token过期时间 在JWT Token中,一般都会包含过期时间(exp),当Token过期时,需要重新生成一个Token。可以在服务端实现一个接口,用于刷新Token的过期时间。具体实现可以参考以下代码:
public String refreshToken(String token) {
Claims claims = parseToken(token);
Date now = new Date();
if (claims.getExpiration().before(now)) {
throw new RuntimeException("Token已过期");
}
String newToken = Jwts.builder()
.setIssuedAt(now) // 发行时间
.setExpiration(new Date(now.getTime() + EXPIRATION_TIME)) // 过期时间
.setSubject(claims.getSubject())
.signWith(SECRET_KEY)
.compact();
return newToken;
}
- 更换Token 在前端中,可以使用拦截器来检测Token是否过期,如果过期,则需要重新获取Token。具体实现可以参考以下代码:
import {refreshToken} from '@/api/auth'
import store from '@/store'
import router from '@/router'
// 刷新Token
const refreshToken = async () => {
try {
const response = await refreshToken(store.state.token)
const token = response.data.token
store.commit('setToken', token)
return token
} catch (error) {
console.log(error)
return null
}
}
// 创建请求拦截器
axios.interceptors.request.use(
config => {
// 检测Token是否过期
const token = store.state.token
const now = new Date().getTime()
const expiresIn = store.state.expiresIn
if (expiresIn && expiresIn < now) {
const newToken = await refreshToken()
if (newToken) {
config.headers.Authorization = `Bearer ${newToken}`
} else {
throw new Error('Token已过期')
}
} else {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
return Promise.reject(error)
}
)
// 创建响应拦截器
axios.interceptors.response.use(
response => {
return response
},
async error => {
const status = error.response.status
if (status === 401) {
const newToken = await refreshToken()
if (newToken) {
// 重新发送请求
const config = error.response.config
config.headers.Authorization = `Bearer ${newToken}`
return axios(config)
} else {
// 跳转到登录页面
router.push('/login')
}
} else {
return Promise.reject(error)
}
}
)
- 返回特定错误码 在服务端中,可以在JWT Token过期时,返回特定的错误码,以便前端可以根据错误码进行相应的处理。具体实现可以参考以下代码:
public ResponseEntity<?> login(String username, String password) {
// 验证用户名密码是否正确
if (username.equals("admin") && password.equals("admin")) {
String token = Jwts.builder()
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.setSubject(username)
.signWith(SECRET_KEY)
.compact();
return ResponseEntity.ok().header("Authorization", "Bearer " + token).build();
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名或密码错误");
}
}
@ExceptionHandler({ExpiredJwtException.class})
public ResponseEntity<?> handleExpiredJwtException(ExpiredJwtException ex) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token已过期");
}
``
原文地址: https://www.cveoy.top/t/topic/fGDT 著作权归作者所有。请勿转载和采集!