跨境互联网 跨境互联网
首页
  • AI 工具

    • 绘图提示词工具 (opens new window)
    • ChatGPT 指令 (opens new window)
  • ChatGPT

    • ChatGP T介绍
    • ChatGPT API 中文开发手册
    • ChatGPT 中文调教指南
    • ChatGPT 开源项目
  • Midjourney

    • Midjourney 文档
  • Stable Diffusion

    • Stable Diffusion 文档
  • 其他

    • AIGC 热门文章
    • 账号合租 (opens new window)
    • 有趣的网站
  • Vue

    • Vue3前置
  • JAVA基础

    • Stream
    • Git
    • Maven
    • 常用第三方类库
    • 性能调优工具
    • UML系统建模
    • 领域驱动设计
    • 敏捷开发
    • Java 测试
    • 代码规范及工具
    • Groovy 编程
  • 并发编程&多线程

    • 并发编程
    • 高性能队列 Disruptor
    • 多线程并发在电商系统下的应用
  • 其他

    • 面试题
  • 消息中间中间件

    • Kafka
    • RabbitMQ
    • RocketMQ
  • 任务调度

    • Quartz
    • XXL-Job
    • Elastic-Job
  • 源码解析

    • Mybatis 高级使用
    • Mybatis 源码剖析
    • Mybatis-Plus
    • Spring Data JPA
    • Spring 高级使用
    • Spring 源码剖析
    • SpringBoot 高级使用
    • SpringBoot 源码剖析
    • Jdk 解析
    • Tomcat 架构设计&源码剖析
    • Tomcat Web应用服务器
    • Zookeeper 高级
    • Netty
  • 微服务框架

    • 分布式原理
    • 分布式集群架构场景化解决方案
    • Dubbo 高级使用
    • Dubbo 核心源码剖析
    • Spring Cloud Gateway
    • Nacos 实战应用
    • Sentinel 实战应用
    • Seata 分布式事务
  • 数据结构和算法的深入应用
  • 存储

    • 图和Neo4j
    • MongoDB
    • TiDB
    • MySQL 优化
    • MySQL 平滑扩容实战
    • MySQL 海量数据存储与优化
    • Elasticsearch
  • 缓存

    • Redis
    • Aerospike
    • Guava Cache
    • Tair
  • 文件存储

    • 阿里云 OSS 云存储
    • FastDF 文件存储
  • 基础

    • Linux 使用
    • Nginx 使用与配置
    • OpenResty 使用
    • LVS+Keepalived 高可用部署
    • Jekins
  • 容器技术

    • Docker
    • K8S
    • K8S
  • 01.全链路(APM)
  • 02.电商终极搜索解决方案
  • 03.电商亿级数据库设计
  • 04.大屏实时计算
  • 05.分库分表的深入实战
  • 06.多维系统下单点登录
  • 07.多服务之间分布式事务
  • 08.业务幂等性技术架构体系
  • 09.高并发下的12306优化
  • 10.每秒100W请求的秒杀架构体系
  • 11.集中化日志管理平台的应用
  • 12.数据中台配置中心
  • 13.每天千万级订单的生成背后痛点及技术突破
  • 14.红包雨的架构设计及源码实现
  • 人工智能

    • Python 笔记
    • Python 工具库
    • 人工智能(AI) 笔记
    • 人工智能(AI) 项目笔记
  • 大数据

    • Flink流处理框架
  • 加密区

    • 机器学习(ML) (opens new window)
    • 深度学习(DL) (opens new window)
    • 自然语言处理(NLP) (opens new window)
AI 导航 (opens new window)

Revin

首页
  • AI 工具

    • 绘图提示词工具 (opens new window)
    • ChatGPT 指令 (opens new window)
  • ChatGPT

    • ChatGP T介绍
    • ChatGPT API 中文开发手册
    • ChatGPT 中文调教指南
    • ChatGPT 开源项目
  • Midjourney

    • Midjourney 文档
  • Stable Diffusion

    • Stable Diffusion 文档
  • 其他

    • AIGC 热门文章
    • 账号合租 (opens new window)
    • 有趣的网站
  • Vue

    • Vue3前置
  • JAVA基础

    • Stream
    • Git
    • Maven
    • 常用第三方类库
    • 性能调优工具
    • UML系统建模
    • 领域驱动设计
    • 敏捷开发
    • Java 测试
    • 代码规范及工具
    • Groovy 编程
  • 并发编程&多线程

    • 并发编程
    • 高性能队列 Disruptor
    • 多线程并发在电商系统下的应用
  • 其他

    • 面试题
  • 消息中间中间件

    • Kafka
    • RabbitMQ
    • RocketMQ
  • 任务调度

    • Quartz
    • XXL-Job
    • Elastic-Job
  • 源码解析

    • Mybatis 高级使用
    • Mybatis 源码剖析
    • Mybatis-Plus
    • Spring Data JPA
    • Spring 高级使用
    • Spring 源码剖析
    • SpringBoot 高级使用
    • SpringBoot 源码剖析
    • Jdk 解析
    • Tomcat 架构设计&源码剖析
    • Tomcat Web应用服务器
    • Zookeeper 高级
    • Netty
  • 微服务框架

    • 分布式原理
    • 分布式集群架构场景化解决方案
    • Dubbo 高级使用
    • Dubbo 核心源码剖析
    • Spring Cloud Gateway
    • Nacos 实战应用
    • Sentinel 实战应用
    • Seata 分布式事务
  • 数据结构和算法的深入应用
  • 存储

    • 图和Neo4j
    • MongoDB
    • TiDB
    • MySQL 优化
    • MySQL 平滑扩容实战
    • MySQL 海量数据存储与优化
    • Elasticsearch
  • 缓存

    • Redis
    • Aerospike
    • Guava Cache
    • Tair
  • 文件存储

    • 阿里云 OSS 云存储
    • FastDF 文件存储
  • 基础

    • Linux 使用
    • Nginx 使用与配置
    • OpenResty 使用
    • LVS+Keepalived 高可用部署
    • Jekins
  • 容器技术

    • Docker
    • K8S
    • K8S
  • 01.全链路(APM)
  • 02.电商终极搜索解决方案
  • 03.电商亿级数据库设计
  • 04.大屏实时计算
  • 05.分库分表的深入实战
  • 06.多维系统下单点登录
  • 07.多服务之间分布式事务
  • 08.业务幂等性技术架构体系
  • 09.高并发下的12306优化
  • 10.每秒100W请求的秒杀架构体系
  • 11.集中化日志管理平台的应用
  • 12.数据中台配置中心
  • 13.每天千万级订单的生成背后痛点及技术突破
  • 14.红包雨的架构设计及源码实现
  • 人工智能

    • Python 笔记
    • Python 工具库
    • 人工智能(AI) 笔记
    • 人工智能(AI) 项目笔记
  • 大数据

    • Flink流处理框架
  • 加密区

    • 机器学习(ML) (opens new window)
    • 深度学习(DL) (opens new window)
    • 自然语言处理(NLP) (opens new window)
AI 导航 (opens new window)
  • Spring Data JPA
  • MyBatis

  • Spring

  • SpringBoot

  • Jdk

  • Tomcat

  • Netty

  • 若依

    • 源码分析

      • 项目概述
      • 项目运行
      • 构建发布到Linux
      • 系统菜单介绍
      • 开发环境运行
      • 表结构介绍
      • 目录文件介绍
      • 主配置文件介绍
      • SpringBoot简介
      • SpringSecurity简介
      • SpringSecurity配置介绍
      • SpringSecurity密码加密
      • SpringSecurity退出配置
      • SpringSecurity登录配置
      • SpringSecurity权限讲解
      • SpringSecurity权限注解
      • JWT介绍
      • JWT实现
        • JWT过滤器
        • Mybatis配置详解
        • Mybatis使用方式
        • 分页配置详解
        • 分页插件使用
        • 分页代码详解
        • 数据源配置详解
        • 数据源代码详解
        • 多数据源使用
        • 28 新增多数据源(相同数据库)
        • 新增多数据源(不同数据库)
        • 多数据源代码详解
        • 事务简介
        • 事务使用
        • 登录日志
        • 操作日志详解
        • 操作日志实现
        • 数据权限使用详解
        • 数据权限代码详解
        • 数据权限业务实现
        • 代码生成使用(单表)
        • 40 代码生成使用(树表)
        • 代码生成实现详解
        • 定时任务使用详解
        • 定时任务代码详解
        • 服务监控讲解
        • Swagger系统接口使用详解
        • 系统接口实现详解
        • XSS脚本过滤详解
        • 防止重复提交过滤详解
        • 全局异常处理器
        • 框架验证详解
        • 日志配置详解
        • 上传详解
        • 下载详解
        • 前端-前端框架介绍
        • 前端-package.json详解
        • 前端-vue.config.js详解
        • main.js详解
        • 前端-布局设置
        • 导航栏
        • 前端-侧边栏
        • 前端-顶部栏
        • scoped作用域
        • 前端-scoped样式穿透
        • 前端-路由跳转的两种方式
        • 前端-动态路由的跳转方式
        • 前端-开发规范&流程
        • 前端-请求流程
        • 前端-组件使用-引入外部依赖
        • 前端-组件使用-注册组件
        • 前端-组件使用-组件通信
        • 前端-页面权限
        • 前端-多级目录
        • 前端-页签缓存
        • 前端-使用图标
        • 前端-使用字典(dicts方式)
        • 前端-使用参数
        • Postman测试接口
        • 代码单元测试
        • 开发文档介绍和部署
        • 集成Oauth2.0
        • 构建发布到Tomcat
        • 新建业务模块(多模块)
        • 开发自己的业务(多模块)
        • 前端-文件上传
        • 前端-文件下载
        • 前端-配置后端接口地址或域名
        • 前端-部署应用到子路径
        • 禁止多终端同时登录实现
        • 静态资源整合到后端访问
        • 使用加密方式传输登录密码
        • 多数据源事务的一致性
        • 主子表代码生成详解
        • 3.4.0版本更新介绍
        • 使用undertow容器
        • 集成actuator实现优雅关闭应用
        • 集成knife4j实现swagger文档增强
        • 集成easyexcel实现excel表格增强
        • 集成mybatis-plus实现mybatis增强
        • 集成ip2region实现离线IP地址定位
        • 集成druid实现数据库密码加密
        • 集成aj-captcha实现滑块验证码
        • 集成sharding-jdbc实现分库分表
        • v3.5.0版本更新介绍
        • 使用docker实现一键部署
        • v3.6.0版本更新介绍
        • 限流控制详解
        • v3.7.0版本更新介绍
        • v3.8.0版本更新介绍
        • v3.8.1版本更新介绍
        • SSO
        • 绑定使用二级域名
        • 验证码源码解析
        • 资料
      • 源码分析
      • Ruoyi-Flowable
    • Traefik

    • Openresty

    • 开源框架
    • 若依
    • 源码分析
    Revin
    2023-11-30
    目录

    JWT实现

    <!-- Token生成与解析-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>${jwt.version}</version>
    </dependency>
    
    1
    2
    3
    4
    5
    6

    ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java

    **
     * token验证处理
     *
     * @author ruoyi
     */
    @Component
    public class TokenService
    {
        // 令牌自定义标识
        @Value("${token.header}")
        private String header;
    
        // 令牌秘钥
        @Value("${token.secret}")
        private String secret;
    
        // 令牌有效期(默认30分钟)
        @Value("${token.expireTime}")
        private int expireTime;
    
        protected static final long MILLIS_SECOND = 1000;
    
        protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
    
        private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
    
        @Autowired
        private RedisCache redisCache;
    
        /**
         * 获取用户身份信息
         *
         * @return 用户信息
         */
        public LoginUser getLoginUser(HttpServletRequest request)
        {
            // 获取请求携带的令牌
            String token = getToken(request);
            if (StringUtils.isNotEmpty(token))
            {
                try
                {
                    Claims claims = parseToken(token);
                    // 解析对应的权限以及用户信息
                    String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                    String userKey = getTokenKey(uuid);
                    LoginUser user = redisCache.getCacheObject(userKey);
                    return user;
                }
                catch (Exception e)
                {
                }
            }
            return null;
        }
    
        /**
         * 设置用户身份信息
         */
        public void setLoginUser(LoginUser loginUser)
        {
            if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
            {
                refreshToken(loginUser);
            }
        }
    
        /**
         * 删除用户身份信息
         */
        public void delLoginUser(String token)
        {
            if (StringUtils.isNotEmpty(token))
            {
                String userKey = getTokenKey(token);
                redisCache.deleteObject(userKey);
            }
        }
    
        /**
         * 创建令牌
         *
         * @param loginUser 用户信息
         * @return 令牌
         */
        public String createToken(LoginUser loginUser)
        {
            String token = IdUtils.fastUUID();
            loginUser.setToken(token);
            setUserAgent(loginUser);
            refreshToken(loginUser);
    
            Map<String, Object> claims = new HashMap<>();
            claims.put(Constants.LOGIN_USER_KEY, token);
            return createToken(claims);
        }
    
        /**
         * 验证令牌有效期,相差不足20分钟,自动刷新缓存
         *
         * @param loginUser
         * @return 令牌
         */
        public void verifyToken(LoginUser loginUser)
        {
            long expireTime = loginUser.getExpireTime();
            long currentTime = System.currentTimeMillis();
            if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
            {
                refreshToken(loginUser);
            }
        }
    
        /**
         * 刷新令牌有效期
         *
         * @param loginUser 登录信息
         */
        public void refreshToken(LoginUser loginUser)
        {
            loginUser.setLoginTime(System.currentTimeMillis());
            loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
            // 根据uuid将loginUser缓存
            String userKey = getTokenKey(loginUser.getToken());
            redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
        }
    
        /**
         * 设置用户代理信息
         *
         * @param loginUser 登录信息
         */
        public void setUserAgent(LoginUser loginUser)
        {
            UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
            String ip = IpUtils.getIpAddr();
            loginUser.setIpaddr(ip);
            loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
            loginUser.setBrowser(userAgent.getBrowser().getName());
            loginUser.setOs(userAgent.getOperatingSystem().getName());
        }
    
        /**
         * 从数据声明生成令牌
         *
         * @param claims 数据声明
         * @return 令牌
         */
        private String createToken(Map<String, Object> claims)
        {
            String token = Jwts.builder()
                    .setClaims(claims)
                    .signWith(SignatureAlgorithm.HS512, secret).compact();
            return token;
        }
    
        /**
         * 从令牌中获取数据声明
         *
         * @param token 令牌
         * @return 数据声明
         */
        private Claims parseToken(String token)
        {
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        }
    
        /**
         * 从令牌中获取用户名
         *
         * @param token 令牌
         * @return 用户名
         */
        public String getUsernameFromToken(String token)
        {
            Claims claims = parseToken(token);
            return claims.getSubject();
        }
    
        /**
         * 获取请求token
         *
         * @param request
         * @return token
         */
        private String getToken(HttpServletRequest request)
        {
            String token = request.getHeader(header);
            if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
            {
                token = token.replace(Constants.TOKEN_PREFIX, "");
            }
            return token;
        }
    
        private String getTokenKey(String uuid)
        {
            return CacheConstants.LOGIN_TOKEN_KEY + uuid;
        }
    }
    
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203

    # 创建令牌

    /**
     * 创建令牌
     *
     * @param loginUser 用户信息
     * @return 令牌
     */
    public String createToken(LoginUser loginUser)
    {
        String token = IdUtils.fastUUID();
        loginUser.setToken(token);
        setUserAgent(loginUser);
        refreshToken(loginUser);
    
        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        return createToken(claims);
    }
    
    
    /**
         * 从令牌中获取数据声明
         *
         * @param token 令牌
         * @return 数据声明
         */
        private Claims parseToken(String token)
        {
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        }
    
    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

    他没有将很多的信息存储到jwt里,而是将数据存储到了redis里,然后生成出来的一个字符串为标识用户的token,去redis拿数据。

    # 获取用户信息

    解析jwt,拿到那个Redis key 然后,获取信息

     /**
         * 获取用户身份信息
         *
         * @return 用户信息
         */
        public LoginUser getLoginUser(HttpServletRequest request)
        {
            // 获取请求携带的令牌
            String token = getToken(request);
            if (StringUtils.isNotEmpty(token))
            {
                try
                {
                    Claims claims = parseToken(token);
                    // 解析对应的权限以及用户信息
                    String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                    String userKey = getTokenKey(uuid);
                    LoginUser user = redisCache.getCacheObject(userKey);
                    return user;
                }
                catch (Exception e)
                {
                }
            }
            return null;
        }
    
    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

    image-20231205233645445

    上次更新: 2025/04/03, 11:07:08
    JWT介绍
    JWT过滤器

    ← JWT介绍 JWT过滤器→

    最近更新
    01
    tailwindcss
    03-26
    02
    PaddleSpeech
    02-18
    03
    whisper
    02-18
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 跨境互联网 | 豫ICP备14016603号-5 | 豫公网安备41090002410995号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式