1. 刷新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;
}
  1. 更换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)
    }
  }
)
  1. 返回特定错误码 在服务端中,可以在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已过期");
}
``
java 微信小程序使用 jwt token如何刷新token过期时间如何更换token保持请求发送成功后前端为uniapp怎么重新发送请求服务端怎么返回特定错误码详细代码

原文地址: https://www.cveoy.top/t/topic/fGDT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录