提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在高并发场景下,保证接口幂等性是非常重要的,以防止重复操作导致的数据不一致等问题。以下分别介绍防重令牌(token)、随机字符串(noncestr,本质和 token 类似)、幂等表、防重表(和幂等表概念相近)、数据库唯一索引这几种保证接口幂等性的方式,并给出相应的代码示例(以 Java 和 MySQL 为例)。
一、防重令牌(token)
原理:客户端在调用接口前,先向服务器获取一个唯一的令牌(token)。调用接口时,将该令牌作为参数传递给服务器。服务器在处理请求前,先检查该令牌是否已被使用。如果已使用,则拒绝处理请求;如果未使用,则处理请求并标记该令牌已使用。
实现步骤:
1. 生成令牌:客户端调用获取令牌接口,服务器生成一个唯一的令牌并返回给客户端。
2. 传递令牌:客户端在调用业务接口时,将获取到的令牌作为参数传递。
3. 使用令牌:如果令牌有效,服务器处理业务逻辑,并将令牌标记为已使用:服务器在处理业务接口请求时,先查询令牌表,验证令牌是否有效且未被使用。
4. 使用令牌:如果令牌有效,服务器处理业务逻辑,并将令牌标记为已使用
代码示例
1.生成令牌接口:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
@RestController
public class TokenController {
@GetMapping("/generateToken")
public String generateToken() {
return UUID.randomUUID().toString();
}
}
2.业务接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@Autowired
private JdbcTemplate jdbcTemplate;
@PostMapping("/createOrder")
public String createOrder(@RequestParam String token, @RequestParam String orderInfo) {
// 验证令牌
String checkTokenSql = "SELECT COUNT(*) FROM token_table WHERE token =? AND used = 0";
int count = jdbcTemplate.queryForObject(checkTokenSql, new Object[]{
token}, Integer.class);
if (count == 0) {
return "Invalid token or token already used";
}
// 处理业务逻辑,例如创建订单
String createOrderSql = "INSERT INTO orders (order_info) VALUES (?)";
jdbcTemplate.update(createOrderSql, orderInfo);
// 标记令牌已使用
String updateTokenSql <