• 你真的了解token续期嘛?


    Spring Boot + Vue中的Token续签机制

    在这个示例中,我们将使用Spring Boot作为后端框架,Vue作为前端框架,演示如何在全栈应用中实现长短Token的续签。

    1. Spring Boot后端

    1.1 长Token的生成

    在Spring Boot中,我们首先创建一个服务来生成JWT Token。使用jjwt库,确保在pom.xml文件中添加以下依赖:

    <dependency>
        <groupId>io.jsonwebtokengroupId>
        <artifactId>jjwtartifactId>
        <version>0.9.1version>
    dependency>
    

    然后,创建JwtTokenService服务:

    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.springframework.stereotype.Service;
    import java.util.Date;
    
    @Service
    public class JwtTokenService {
    
        private String secretKey = "your_secret_key";
    
        public String generateLongToken(String username) {
            long expiration = 7 * 24 * 60 * 60 * 1000; // 7 days
            return Jwts.builder()
                    .setSubject(username)
                    .setExpiration(new Date(System.currentTimeMillis() + expiration))
                    .signWith(SignatureAlgorithm.HS256, secretKey)
                    .compact();
        }
    
        // ... 其他方法 ...
    }
    

    1.2 短Token的生成

    添加生成短Token的方法:

    public String generateShortToken(String username) {
        long expiration = 15 * 60 * 1000; // 15 minutes
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }
    

    1.3 Token续签

    创建一个方法用于续签Token:

    public String renewToken(String oldToken) {
        // 解析旧Token获取用户名
        String username = Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(oldToken)
                .getBody()
                .getSubject();
    
        // 生成新的短Token
        return generateShortToken(username);
    }
    

    2. Vue前端

    在Vue应用中,确保每次请求时都附加Token,并在需要时更新Token。

    2.1 处理Token过期

    在Vue应用中,可以使用拦截器来检查Token是否过期,如果过期则触发续签流程:

    // main.js 或者其他入口文件
    import Vue from 'vue';
    import axios from 'axios';
    
    // 设置axios拦截器
    axios.interceptors.request.use(
      config => {
        // 在发送请求之前做些什么
        const token = localStorage.getItem('token');
        if (token) {
          // 如果存在令牌,将其添加到请求头
          config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
      },
      error => {
        // 对请求错误做些什么
        return Promise.reject(error);
      }
    );
    
    axios.interceptors.response.use(
      response => {
        // 对响应数据做些什么
        return response;
      },
      error => {
        // 对响应错误做些什么
        const originalRequest = error.config;
        
        if (error.response.status === 401 && !originalRequest._retry) {
          // 如果响应状态为401(未授权)并且尚未重试过
          originalRequest._retry = true;
          
          // 发送续期请求
          return axios.post('/api/renew-token')
            .then(response => {
              // 更新本地存储的令牌
              updateLocalStorageToken(response.data.token);
              
              // 重新发送原始请求
              return axios(originalRequest);
            });
        }
        
        return Promise.reject(error);
      }
    );
    
    // 将axios添加到Vue的原型中,使其在组件中可以直接使用
    Vue.prototype.$http = axios;
    

    通过这个拦截器,我们在每次请求时就可以检查Token是否过期,如果过期则触发续签流程。这样就实现了在Vue前端应用中的Token续签机制。

  • 相关阅读:
    清洁机器人--洗地机SOC SSD202D开发经验总结
    JavaSE | 初识Java(七) | 数组 (下)
    解决PyTorch中的RuntimeError: CUDA error: device-side assert triggered
    智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptr&weak_ptr || 循环引用问题】
    qt关于在linux系统中使用qmake编译项目遇到的问题
    如何转换图片格式?教你三招一键轻松转换图片格式
    SpringCloud Alibaba - Nacos
    探索图像分辨率对于模型的影响,基于yolov5x开发构建桥洞、隧道、涵洞等水泥洞体建筑裂缝缺陷等检测识别系统
    Idea Maven项目打包工其他项目进行外部引用
    (一)Vue核心
  • 原文地址:https://www.cnblogs.com/lyxlucky/p/17969615