首页 > 数据库 >redis 使用token实现重复提交

redis 使用token实现重复提交

时间:2023-11-12 10:06:03浏览次数:38  
标签:提交 -- Redis void redis Token token key String

使用Token实现重复提交

介绍

在Web开发过程中,重复提交是一个常见的问题。为了防止用户多次提交同一请求,我们可以使用Token实现重复提交的校验。本文将介绍如何使用Redis来实现这一功能。

流程图

flowchart TD
    A(生成Token) --> B(存储Token至Redis)
    B --> C(校验Token)
    C --> D(处理请求)

步骤

生成Token

首先,我们需要在用户请求的时候生成一个Token,并将其返回给前端。Token可以由随机字符串组成,确保其唯一性。

// 生成Token
String token = UUID.randomUUID().toString();
return token;

存储Token至Redis

接下来,我们需要将生成的Token存储到Redis中,并设置一个过期时间。这样可以确保Token在一段时间后自动失效,防止大量无效的Token占用内存。

// 存储Token至Redis
String key = "token:" + token;
redis.set(key, "true");
redis.expire(key, 60); // 设置过期时间为60秒

校验Token

在处理请求之前,我们需要先校验Token是否有效。如果Token不存在或已失效,则说明这是一次重复提交,需要进行相应的处理。

// 校验Token
String key = "token:" + token;
Boolean exists = redis.exists(key);
if (exists != null && exists) {
    // Token存在,重复提交
    // 返回错误提示或进行其他处理
} else {
    // Token不存在,正常处理请求
    // 执行相应的业务逻辑
}

处理请求

最后,根据业务需求处理请求,在这里我们可以执行相应的业务逻辑。

// 处理请求
// 执行相应的业务逻辑

类图

classDiagram
    class Redis {
        +exists(key: String): Boolean
        +set(key: String, value: String): void
        +get(key: String): String
        +expire(key: String, seconds: int): void
        +delete(key: String): void
    }
    
    class RequestHandler {
        +handleRequest(request: Request): void
    }
    
    class TokenInterceptor {
        +preHandle(request: Request, response: Response, handler: Object): boolean
    }
    
    class UserController {
        -redis: Redis
        +register(request: Request): void
        +login(request: Request): void
        +logout(request: Request): void
    }
    
    class Application {
        +main(args: String[]): void
    }
    
    Redis -- UserController
    RequestHandler -- UserController
    TokenInterceptor -- UserController
    UserController -- Application

总结

通过使用Token实现重复提交的校验,我们可以避免用户多次提交同一请求,保证数据的一致性和安全性。在本文中,我们使用Redis来存储和校验Token,具体的实现流程如上所述。当然,根据实际需求,我们可以自定义Token的生成规则、存储方式和校验逻辑。希望本文能够帮助到你,如果有任何疑问,请随时向我提问。

标签:提交,--,Redis,void,redis,Token,token,key,String
From: https://blog.51cto.com/u_16213321/8322359

相关文章

  • Redission实现公平锁为什么要使用ZSet数据结构?
    Redission实现公平锁为什么要使用ZSet数据结构?使用ZSet结构有什么好处?看lua代码好像也并没有使用到ZSet的二分查找这种优势,在Redisson中实现公平锁时使用ZSet(有序集合)数据结构有以下几个好处:具有排序功能:ZSet是有序的数据结构,其中的每个元素都有一个分数(score)与之相关联。这使得R......
  • Redis服务端优化
    持久化配置Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:①用来做缓存的Redis实例尽量不要开启持久化功能②建议关闭RDB持久化功能,使用AOF持久化③利用脚本定期在slave节点做RDB,实现数据备份④设置合理的rewrite阈值,避免频繁的bgrewrite⑤......
  • Nest + Redis + 地图,实现附近的充电宝
    想必大家都打过车,打车软件可以根据你的当前位置搜索附近的车辆:这两天国庆节,大家出去玩可能会借用共享充电宝。它也是基于你的位置来搜索附近充电宝:再就是大家搜索附近的酒店、餐厅等,也是基于位置的搜索。那么问题来了:这种附近的人、附近的酒店、附近的充电宝的功能是怎么实现的呢?答......
  • Redis6.0使用多线程是怎么回事?
    Redis不是说用单线程的吗?怎么6.0成了多线程的?Redis6.0的多线程是用多线程来处理数据的读写和协议解析,但是Redis执行命令还是单线程的。这样做的⽬的是因为Redis的性能瓶颈在于⽹络IO⽽⾮CPU,使⽤多线程能提升IO读写的效率,从⽽整体提⾼Redis的性能。为什么命令执行为什么不采用多线......
  • redis系列~通用基础知识
    Redis为什么这么快完全基于内存操作使⽤单线程,避免了线程切换和竞态产生的消耗基于⾮阻塞的IO多路复⽤机制C语⾔实现,优化过的数据结构,基于⼏种基础的数据结构,redis做了⼤量的优化,性能极⾼IO多路复用机制讲解,I/O多路复用是指利用单个线程来同时监听多个Socket,并在某个Socket......
  • Redis Functions 介绍之二
    首先,让我们先回顾一下上一篇讲的在RedisFunctions中关于将key的名字作为参数和非key名字作为参数的区别,先看下面的例子。首先,我们先在一个Lua脚本文件mylib.lua中定义如下的库和函数。//--------------------mylib.lua文件开始-----------//#!luaname=myliblocalfunct......
  • Redis Functions 介绍之二
    首先,让我们先回顾一下上一篇讲的在RedisFunctions中关于将key的名字作为参数和非key名字作为参数的区别,先看下面的例子。首先,我们先在一个Lua脚本文件mylib.lua中定义如下的库和函数。//--------------------mylib.lua文件开始-----------//#!luaname=myliblocalfunctio......
  • token、session和cookie的对比
    Cookie1991年HTTP0.9诞生了,当时只是为了满足大家浏览web文档的要求,所以只有GET请求,浏览完了就走了,两个连接之间是没有任何联系的,这也是HTTP为无状态的原因,因为它诞生之初就没有这个需求。但随着交互式Web的兴起(所谓交互式就是你不光可以浏览,还可以登录,发评论,购物等......
  • docker redis
    dockerrun--restart=always-p6379:6379--nameredis-dredis:latest--requirepass123456dockerrun--restart=always\-p6379:6379\--nameredis\-v/opt/redis/conf/redis.conf:/etc/redis/redis.conf\-v/opt/redis/data:/data\-dredisredis-s......
  • redis 6个节点(3主3从),始终一个节点不能启动
    redis节点,始终有一个节点不能启动起来1.修改了配置文件protected-modeno,重启修改了配置文件protected-modeno,重启redis问题依然存在2、查看/var/log/message的redis日志Aug2107:40:33redisMasterkernel:Outofmemory:Killprocess31814(redis-server)score193ors......