订单防重复提交:token 发放以及校验
1. 基于Token校验避免订单重复提交
在很多秒杀场景中,用户为了能下单成功,会频繁的点击下单按钮,这时候如果没有做好控制的话,就可能会给一个用户创建重复订单。
如何防止这个问题呢?
其实有一个好办法,那就是用户在下单的时候,带一个 token 过来,我们校验这个 token 的有效性,如果 token 有效,则允许下单,如果无效,则不允许用户下单。
注意注意注意:这里的 token 和 sa-token(鉴权token) 这个框架中的 token 不是一回事儿,也没有任何关系。
sa-token 里面的那个 token是用于登录鉴权的。
而这里的 token 是用来防止订单重复提交的,他俩不是一个 token,这里的 token 也不是 sa-token 发放的,而是我们自己实现的一个发放和存储,以及后续的校验,都是我们自己做的。
那么,这个 token 是如何发放和校验的的呢?
token 的发放比较简单,我们定义一个 controller,在下单页面渲染的时候从接口中获取一下就行了。
package cn.hollis.nft.turbo.web.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.redisson.api.RScript;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Arrays;
public class TokenFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(TokenFilter.class);
public static final ThreadLocal<String> tokenThreadLocal = new ThreadLocal<>();
private RedissonClient redissonClient;
public TokenFilter(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化,可选实现
}
@Override
public void doFilter(ServletReq