首页 > 其他分享 >Token令牌机制

Token令牌机制

时间:2024-09-18 12:22:43浏览次数:3  
标签:令牌 请求 redis token 重表 Token 支付 机制 PENDING

为每个请求生成一个唯一的Token,并在服务端进行校验,一旦处理了对应的请求,就丢弃该Token,避免重复处理。具体步骤:




1、服务端提供了发送 token 的接口。我们在分析业务的时候,哪些业务是存在幂等问题的, 就必须在执行业务前,先去获取 token,服务器会把 token 保存到 redis 中。


2、然后调用业务接口请求时,把 token 携带过去,一般放在请求头部。


3、服务器判断 token 是否存在 redis 中,存在表示第一次请求,然后删除 token,继续执行业务。


4、如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给 client,这样就保证了业务代码,不被重复执行。


核心逻辑:


// 服务端接口,接收请求并处理token

void do(String token) {

   if (Redis.exists(token)) {

      // 删除token,确保不会重复处理

       Redis.del(token);

       // 执行具体的业务操作

       doSometing();

   } else {

       log.info(token);

   }

}

注意:最好设计为先删除 token,如果业务调用失败,就重新获取 token 再次请求。可以在 redis 使用 lua 脚本完成这个操作


if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end

6. 状态机

 使用状态机是判断业务流程,确保操作只执行一次。


状态机设计:


订单创建:订单初始化,状态为 PENDING(待支付)。


支付操作:当订单状态为 PENDING 时,允许执行支付操作,支付成功后状态变为 PAID(已支付)。


重复支付检查:如果再次尝试支付一个已经是 PAID 状态的订单,状态机将拒绝该操作,保持订单状态不变。


实现案例


public enum OrderStatus {

   PENDING, PAID, CANCELLED

}

public class Order {

   private OrderStatus status; // 订单当前状态

   // 其他订单属性...

   public Order() {

       this.status = OrderStatus.PENDING; // 初始化状态为待支付

   }

   // 执行支付操作

   public synchronized void pay() {

       if (this.status == OrderStatus.PENDING) {

           // 执行支付逻辑,如减少库存、扣款等

           this.status = OrderStatus.PAID; // 状态转变为已支付

       } else {

           // 如果订单不是在待支付状态,抛出异常或记录日志

           throw new IllegalStateException("Order can only be paid when status is PENDING");

       }

   }

   // 其他业务逻辑...

}


幂等性保证:


支付操作 pay 在订单状态不是 PENDING 时不会被执行,从而保证了幂等性。


如果有重复的支付请求,由于状态机的保护,第二次及后续的支付请求将不会改变订单状态,因此不会执行重复的支付逻辑。


7. 去重表

 记录已经处理过的请求标识,对于重复的请求直接返回结果,而不再次执行业务逻辑。


1、去重表结构设计


表字段至少包括:


请求标识符:唯一标识一次请求。


创建时间:记录请求的时间戳。


处理状态:标识请求是否已处理,以及处理的结果。


2、设置过期策略


 为了防止去重表无限增长,表中的记录可以设置过期时间。使用定时任务定期清理旧的请求记录。


实现案例:


1、检查去重表


在执行业务逻辑之前,检查去重表确定该请求是否已经被处理过。


boolean isDuplicate = checkDuplicateInDatabase(requestId);

2、处理请求


if (isDuplicate) {

   // 返回之前的结果或拒绝处理

   return previousResult;

} else {

   // 执行业务逻辑

   doSomthing();

   // 记录去重表

   saveRecord(requestId);

   // 返回新的结果

   return newResult;

}

注意事项:


数据一致性:确保去重表的更新与业务逻辑的执行保持一致性,避免出现数据不一致的情况。


8. 全局请求唯一ID

调用接口时,生成一个唯一 id,redis 将数据保存到集合中(去重),存在即处理过。


可以使用 nginx 设置每一个请求的唯一 id;


proxy_set_header X-Request-Id $request_id;



标签:令牌,请求,redis,token,重表,Token,支付,机制,PENDING
From: https://blog.51cto.com/u_16265692/12044978

相关文章

  • YOLOv8改进 - 注意力篇 - 引入CBAM注意力机制
    一、本文介绍作为入门性第一篇,这里介绍了CBAM注意力在YOLOv8中的使用。包含CBAM原理分析,CBAM的代码、CBAM的使用方法、以及添加以后的yaml文件及运行记录。二、CBAM原理分析CBAM官方论文地址:CBAM论文CBAM的pytorch版代码:CBAM的pytorch版代码CBAM:卷积块注意力模块,由通道......
  • Selenium等待机制:理解并应用显式等待与隐式等待,解决页面加载慢的问题
    引言在Web自动化测试和网页数据抓取中,Selenium是一款非常流行的工具。然而,由于网络延迟、页面元素异步加载等原因,直接执行操作可能会导致元素未找到或操作失败。为了解决这个问题,Selenium提供了多种等待机制,其中最常用的是显式等待(ExplicitWait)和隐式等待(ImplicitWait)。本文将详......
  • 信号的机制——信号处理函数的注册
    在Linux操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过kill-l命令,查看所有的信号。#kill-l1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)......
  • Sa-Token的v1.39.0自定义鉴权注解怎么玩
    个人博客:无奈何杨(wnhyang)个人语雀:wnhyang共享语雀:在线知识共享Github:wnhyang-Overview简介在Sa-Token最新的v1.39.0版本的更新日志中有这么一句话核心:升级:重构注解鉴权底层,支持自定义鉴权注解了。[重要]正巧最近有看一个关于鉴权的东西,顺便看一下吧!常见的自定义注解鉴权目标:对于......
  • 前端JavaScript面试重难点: 闭包+内存泄漏+垃圾回收机制
    前置知识!!!闭包是Javascript语言的一个重难点,也是它的特色,很多高级应用都要依靠闭包来实现。在各种专业文献上学习"闭包"的时候,就一个感觉–“抽象”!特别是学习内存泄漏的时候,没想明白为什么使用闭包的时候不及时清除函数中的元素会导致内存泄漏,直到我的......
  • Transformer-Attention机制
    出现Attention机制的原因:基于循环神经网络(RNN)的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果。1seq2seq框架seq2seq:从一个文本序列得到一个新的文本序列。典型的seq2seq任务包括:机器翻译任务、文本摘要任务。简而言之就是......
  • 嵌入式单片机程序运行机制,从helloworld说起
    1开篇学习任何一门编程语言,都会从helloworld开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的helloworld。然而,对于helloworld这个简单程序的内部运行机制,相信还有很多人都不是很清楚。helloworld这些信息是如何通显示器过显示的?cpu执行的代码和......
  • 【Java】深入理解Java中的多线程同步机制
    一、多线程的数据不一致    当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。    这个时候,一个在单线程模型下不存在的问题就会发生:如果多个线程同时读写共享......
  • C语言中的GCC的优化和数组的存放方式、Cache机制、访问局部性
    “我们仍需共生命的慷慨与繁华相爱,即使岁月以刻薄和荒芜相欺”文章目录前言文章有误敬请斧正不胜感恩!第一题:***什么是gcc:***C语言中,“gcc-O2”是使用GCC编译器时的一个编译选项。第一部分:为什么程序一输出0,而程序二输出1?第二题:第二部分:为什么两个循环版本的性能......
  • ROS的通讯机制(一):常用命令
        一、rosnode:操作节点        rosnode是用于获取节点信息的命令。相关命令:rosnodeping测试到节点的连接状态rosnodelist列出活动节点rosnodeinfo打印节点信息rosnodemachine列出指定设备上节点rosnodekill......