接口幂等性 token机制(防重令牌) 基于springboot2 redis实现 请提供示例代码

在基于Spring Boot 2和Redis实现防重令牌的幂等性控制时,你可以使用Redis存储令牌信息,并在接口请求时验证令牌的有效性。下面是一个简单的示例代码,演示了如何使用Spring Boot 2和Redis实现防重令牌的机制:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class TokenService {

    private static final String REDIS_KEY_PREFIX = "api:token:";

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 生成并存储防重令牌
     *
     * @return 生成的令牌
     */
    public String generateAndStoreToken() {
        String token = generateToken();
        String redisKey = REDIS_KEY_PREFIX + token;
        // 将令牌存储到Redis,并设置过期时间
        redisTemplate.opsForValue().set(redisKey, "", 5, TimeUnit.MINUTES);
        return token;
    }

    /**
     * 检查令牌的有效性,防止重复提交
     *
     * @param token 要检查的令牌
     * @return true:令牌有效;false:令牌无效
     */
    public boolean isTokenValid(String token) {
        String redisKey = REDIS_KEY_PREFIX + token;
        // 检查Redis中是否存在该令牌
        return !redisTemplate.hasKey(redisKey);
    }

    /**
     * 生成唯一的令牌
     *
     * @return 生成的令牌
     */
    private String generateToken() {
        return UUID.randomUUID().toString();
    }
}

在这个例子中,TokenService 提供了两个主要方法:

  1. generateAndStoreToken() 用于生成令牌并将其存储到Redis中,同时设置了令牌的过期时间为5分钟。
  2. isTokenValid(String token) 用于检查令牌的有效性,确保一个令牌在有效期内只能使用一次。

在你的Controller中,你可以使用TokenService来防止接口的重复提交:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class MyController {

    @Autowired
    private TokenService tokenService;

    @PostMapping("/submitData")
    public String submitData(@RequestParam String data, @RequestParam String token) {
        // 检查令牌的有效性
        if (!tokenService.isTokenValid(token)) {
            return "重复提交,令牌无效!";
        }

        // 处理业务逻辑,例如保存数据等

        // 使用完令牌后,可以将其从Redis中删除,确保该令牌在有效期内只能使用一次
        // 这样做是为了确保幂等性,防止同一请求多次提交
        // 注意:这里删除操作是可选的,根据业务需求和实际情况考虑是否需要删除
        // String redisKey = "api:token:" + token;
        // redisTemplate.delete(redisKey);

        return "数据提交成功!";
    }
}

在这个例子中,当客户端发起一个请求时,需要携带一个令牌 token。在Controller中,首先通过tokenService.isTokenValid(token)检查令牌的有效性,如果有效则处理业务逻辑,然后可以选择将令牌从Redis中删除,确保同一个令牌在有效期内只能使用一次。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体业务需求进行更详细的处理。


接口幂等性(防重令牌)(重复提交)_接口幂等性,防止重复提交-CSDN博客
https://blog.csdn.net/m0_55990500/article/details/127316115?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%98%B2%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%20%E4%BB%A4%E7%89%8C%E6%9C%BA%E5%88%B6&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-127316115.142v96pc_search_result_base4&spm=1018.2226.3001.4187

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值