Java:token自动续期,使用Gateway过滤器—GlobalFilter

文章目录

  • 前言
  • 一、使用步骤
    • 1.实体user
    • 2.登录AuthController
    • 3.网关GatewayFilter
    • 4.续约TokenService
  • 总结


前言

在系统中,在 token 的有效期内,可以登录使用,并且要求如果一直使用系统,一直保持登录状态,而不是 token 过期就直接退出系统了,所以需要在操作系统时保持对 token 有效期的续期。

本文是以 gateway 网关过滤器功能实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用步骤

1.实体user

  • 在用户的实体类中添加如下几个字段
private Integer expireTime;	// 登录超时时间,单位min,此为数据库存的,用户可以自由设置过期时间(按需操作)
private Long loginTime;		// 登录时间
private Long failureTime;	// 过期时间
private String token;		// 用户唯一标识

2.登录AuthController

public class AuthController {

	private static final long MILLIS_SECOND = 1000;
    private static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
    @Autowired
    private RedisUtil redisUtil;
    
	@PostMapping("/login")
    public R login( HttpServletRequest request, @RequestBody AuthUser user){
        // 验证用户名密码、验证码、登录次数、禁用账号等代码省略...
        // userEntity为数据库查询出来的用户信息
        // 登录超时时间,数据库获取,如无此需求,可规定 30min过期即可
        Integer expireTime = userEntity.getExpireTime();	
        userEntity.setLoginTime(System.currentTimeMillis());
        userEntity.setFailureTime(userEntity.getLoginTime() + expireTime * MILLIS_MINUTE);
        userEntity.setToken(request.getSession().getId());	// 使用uuid等唯一标识即可
        //放入缓存
        redisUtil.set("token_" + request.getSession().getId(),
                JSON.toJSONString(userEntity), expireTime, TimeUnit.MINUTES);
        return R.ok().setObj(request.getSession().getId());
    }
}

3.网关GatewayFilter

  • 其中一些代码已省略,只保存了续约token的代码:tokenService.verifyToken(user);
@Slf4j
@Order(-1)		// 保证请求必经此代码
@Component
public class GatewayFilter implements GlobalFilter {
    @Autowired
    private TokenService tokenService;
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        HttpHeaders headers = exchange.getRequest().getHeaders();
        List<String> tokenList = headers.get("Access-Token");
        ServerHttpRequest request = exchange.getRequest();
        String url = request.getURI().getPath();
        // 其中一些代码已省略,只保存了续约token的代码
        String user = (String) redisUtil.get("token_" + tokenList.get(0));
        if (!StringUtils.isEmpty(user)) {
        	// 自动刷新缓存
            tokenService.verifyToken(user);
        }
    }
}

4.续约TokenService

/**
 * @author wangrui
 * @date 2024/1/19
 * @description token
 **/
@Component
@Slf4j
public class TokenService {

    @Autowired
    private RedisUtil redisUtil;

    private static final long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
    private static final long MILLIS_SECOND = 1000;
    private static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
    private static final String TOKEN = "token_";

    /**
     * 验证token
     * @param user user的json字符串,看具体存的啥就取啥,解析成所需要的user即可
     */
    public void verifyToken(String user) {
        UserEntity userEntity = JSONObject.parseObject(user).toJavaObject(UserEntity.class);
        long failureTime = userEntity.getFailureTime();
        long currentTime = System.currentTimeMillis();
        // 如果有效期小于20min则续约token
        if (failureTime - currentTime <= MILLIS_MINUTE_TEN) {
            refreshToken(userEntity);
        }
    }

    /**
     * 刷新token有效期
     * @param userEntity u
     */
    public void refreshToken(UserEntity userEntity) {
        userEntity.setLoginTime(System.currentTimeMillis());
        userEntity.setFailureTime(userEntity.getLoginTime() + userEntity.getExpireTime() * MILLIS_MINUTE);
        // 刷新缓存
        redisUtil.set(TOKEN + userEntity.getToken(),
                JSON.toJSONString(userEntity), userEntity.getExpireTime(), TimeUnit.MINUTES);
    }
}

总结

清浅时光,心有明媚,处处温暖,情有阳光,时时灿烂。当内心充满祥和,在哪里都是一样欢喜自在;当内心充满智慧,一花一草尽显法身。若能放下心中的执着与挑剔,那么你相逢的一切,皆是美好。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL存储函数与存储过程习题

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 ​ ​ sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 2 1、创建一个可以统计表格内记录…

pytest文档35-Hooks函数之统计测试结果(pytest_terminal_summary)

前言 用例执行完成后&#xff0c;我们希望能获取到执行的结果&#xff0c;这样方便我们快速统计用例的执行情况。 也可以把获取到的结果当成总结报告&#xff0c;发邮件的时候可以先统计测试结果&#xff0c;再加上html的报告。 pytest_terminal_summary 关于TerminalReport…

Kubernetes(K8S)拉取本地镜像部署Pod 实现类似函数/微服务功能(可设置参数并实时调用)

以两数相加求和为例&#xff0c;在kubernetes集群拉取本地的镜像&#xff0c;实现如下效果&#xff1a; 1.实现两数相加求和 2.可以通过curl实时调用&#xff0c;参数以GET方式提供&#xff0c;并得到结果。&#xff08;类似调用函数&#xff09; 一、实现思路 需要准备如下的…

绑定class,条件渲染,列表过滤,列表排序

目录​​​​​​​ 绑定class 条件渲染 列表过滤 列表排序 绑定class <div class"normal" :class"mood" click"changename">111{{name}}</div><div class"normal" :class"arr">111{{name}}</div…

AI嵌入式K210项目(15)-安全散列算法加速器

文章目录 前言一、什么是SHA256&#xff1f;实验原理 二、K210的安全散列算法加速器三、实验过程总结 前言 K210内置了丰富的加速器&#xff0c;包括神经网络处理器 (KPU)&#xff0c;AES(高级加密加速器)&#xff0c;APU 麦克风阵列语音数据加速计算处理器&#xff0c;现场可…

计算机网络-ACL访问控制列表

上一篇介绍NAT时候就看到了ACL这个东西了&#xff0c;这个是什么意思&#xff1f;有什么作用呢&#xff1f; 一、ACL访问控制列表 访问控制列表 (ACL, Access Control List)是由一系列permit或deny语句组成的、有序规则的列表。ACL是一个匹配工具&#xff0c;能够对报文进行匹配…

前端学习路线图和一些经验

关于前端目前个人建议的一个路线,也是自己之前前端学习时候的一个大致路线,给想要学习前端的小白一个参考,以前自己刚开始接触前端的时候就是不知道该按照什么路线学习 eg-前端是做什么的&#xff1f; 就是开发网站,移动端&#xff0c;小程序之类的页面 调调接口完成页面的渲…

异步非阻塞事件驱动架构的具体流程解析

异步非阻塞事件驱动架构是一种高效的编程和系统设计模式&#xff0c;特别适用于需要处理大量并发连接和请求的应用&#xff0c;如Web服务器。 1. 初始化和启动 启动过程&#xff1a;当Nginx启动时&#xff0c;它的主进程初始化配置并启动多个工作进程。工作进程创建&#xff1…

虚拟线程探索与实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

杂记 | 在Linux上使用Docker-compose安装单机版Milvus向量数据库并配置访问控制和可视化面板(Attu)

文章目录 01 Milvus向量数据库简介02 安装前的准备03 安装3.1 创建milvus工作目录3.2 下载并编辑docker-compose.yml3.3 下载milvus.yml文件3.4 启动milvus 04 访问可视化面板并修改密码 01 Milvus向量数据库简介 Milvus是一款开源的向量数据库&#xff0c;它专为AI应用设计&a…

移动端 h5-table react版本支持虚拟列表

介绍 适用于 react ts 的 h5 移动端项目 table 组件 github 链接 &#xff1a;https://github.com/duKD/react-h5-table 有帮助的话 给个小星星 有两种表格组件 常规的&#xff1a; 支持 左侧固定 滑动 每行点击回调 支持 指定列排序 支持滚动加载更多 效果和之前写的vue…

聚类模型评估指标

聚类模型评估指标-轮廓系数 计算样本i到同簇其它样本到平均距离ai&#xff0c;ai越小&#xff0c;说明样本i越应该被聚类到该簇&#xff08;将ai称为样本i到簇内不相似度&#xff09;&#xff1b;计算样本i到其它某簇Cj的所有样本的平均距离bij&#xff0c;称为样本i与簇Cj的…

鉴源实验室|自动驾驶仿真测试技术分析

01 引言 随着科技的不断发展&#xff0c;自动驾驶技术逐渐成为汽车行业的热门话题。然而&#xff0c;要将自动驾驶车辆投放到真实道路上之前&#xff0c;必须进行广泛的测试&#xff0c;以确保其在各种情况下都能安全可靠地运行。自动驾驶车辆的测试是一个复杂而昂贵的过程。…

AQY212S光耦合器:特性和应用揭秘

在不断发展的电子元件领域&#xff0c;AQY212S光耦合器作为适合众多应用的多功能且可靠的解决方案脱颖而出。作为光耦合器技术专家&#xff0c;让我们深入研究AQY212S的功能和应用&#xff0c;揭开这款令人印象深刻的器件的神秘面纱。 AQY212S是一款固态继电器(SSR)光耦合器&a…

【docker-compose】【nginx】内网环境https配置

目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上&#xff0c;新建cert目录&#xff0c;执行以下指令&#xff0c;然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…

2023年全球软件架构师峰会(ArchSummit深圳站):核心内容与学习收获(附大会核心PPT下载)

本次峰会是一次重要的技术盛会&#xff0c;旨在为全球软件架构师提供一个交流和学习的平台。本次峰会聚焦于软件架构的最新趋势、最佳实践和技术创新&#xff0c;吸引了来自世界各地的软件架构师、技术专家和企业领袖。 在峰会中&#xff0c;与会者可以了解到数字化、AIGC、To…

指针定义与使用

系列文章目录 指针定义与使用 指针定义与使用 系列文章目录一、指针的定义与使用二、相关案例 一、指针的定义与使用 指针 指针的定义和使用&#xff1a; 1、指针&#xff1a;是一种数据类型 指针变量也是一种变量 int* p int*是数据类型 p是指针变量 2、指针格式&#xff1a;…

webpack面试题学习

说说你对webpack的理解&#xff1f;解决了什么问题&#xff1f; 说说webpack的构建流程? 说说webpack中常见的Loader&#xff1f;解决了什么问题&#xff1f; 说说webpack中常见的Plugin&#xff1f;解决了什么问题&#xff1f; 说说Loader和Plugin的区别&#xff1f;编写Load…

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…