springboot解决form表单重复提交方案
发布日期:2021-04-30 21:04:48 浏览次数:100 分类:精选文章

本文共 2128 字,大约阅读时间需要 7 分钟。

在实际业务系统应用中,重复提交表单数据是一个常见问题。为了解决这一问题,我设计了一套基于AOP和Redis的优化方案。

项目总体概况

该方案通过在表单提交时携带token,并利用AOP注解将token与路径组合生成唯一标识符(key),将其存储到Redis中。Redis中的value设置为系统生成的随机字符串,并通过设置过期时间来实现锁定机制。Redis根据过期时间验证key的存在,已存在则不执行后续操作,有效防止重复提交。

实现细节

项目依赖管理

项目依赖主要包括Spring Boot、Redis、Spring Data Redis、Spring Boot Starter Web和Spring Boot Starter AOP等。通过pom.xml文件定义了各个依赖的版本和配置,确保项目能够顺利构建和运行。

配置管理

在application.properties文件中,配置了Redis的基本信息,包括数据库索引、服务器地址、连接端口和密码等。此外,还设置了连接池的最大连接数、最长阻塞等待时间、空闲连接数以及Redis连接超时等参数,确保Redis集群能够高效稳定运行。

核心逻辑实现

// RedisLock.java
public boolean tryLock(String lockKey, String clientId, long seconds) {
return redisTemplate.execute((RedisCallback
) redisConnection -> {
Jedis jedis = (Jedis) redisConnection.getNativeConnection();
String result = jedis.set(lockKey, clientId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, seconds);
return LOCK_SUCCESS.equals(result);
});
}
// RepeatSubmitAspect.java
@Pointcut("@annotation(noRepeatSubmit)")
public void pointCut(NoRepeatSubmit noRepeatSubmit) {}
@Around("pointCut(noRepeatSubmit)")
public Object around(ProceedingJoinPoint pjp, NoRepeatSubmit noRepeatSubmit) throws Throwable {
int lockSeconds = noRepeatSubmit.lockTime();
HttpServletRequest request = RequestUtils.getRequest();
String token = request.getHeader("Authorization");
String path = request.getServletPath();
String key = getKey(token, path);
boolean isSuccess = redisLock.tryLock(key, getClientId(), lockSeconds);
if (isSuccess) {
try {
return pjp.proceed();
} finally {
redisLock.releaseLock(key, getClientId());
}
} else {
return new ApiResult(200, "重复请求,请稍后再试", null);
}
}

控制器逻辑

// SubmitController.java
@PostMapping("submit")
@NoRepeatSubmit(lockTime = 30)
public Object submit(@RequestBody UserBean userBean) {
try {
Thread.sleep(1500);
return new ApiResult(200, "成功", userBean.userId);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

测试验证

通过RunTest.java文件进行多线程测试,模拟多个客户端同时提交请求,验证系统在高并发场景下的性能和重复提交防护能力。

结果展示

通过上述方案,项目能够有效防止表单重复提交问题,并且在高并发场景下表现稳定。

上一篇:SpringCloud之Ribbon
下一篇:【CV5】Tensorflow_Fasterrcnn训练自己数据集

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2026年06月12日 10时12分02秒