1.在进入页面的时候提交修改时间,然后进行提交的时候,将修改时间带入到后台,然后查询数据库,当两个时间相同的时候,进行操作,否则就提示已操作.
2.看到一种更广泛的方式,就是在进入页面的时候生成一个token,然后赋值到session中,同时带入到页面中,然后提交过程中,将页面带入的token与session中的token比较,相同则通过校验并删除session。
3、使用redis分布式锁,这边写了一个通用方法,只需要标注下CustomerLock就可以了
@RequestMapping("test")
@CustomerLock(key="#id",lockTimeOut = 3000)
public void test(@Param("id") @RequiredParam Long id) {
}
@RequestMapping("test")
@CustomerLock(key="#testVo.id",lockTimeOut = 3000)
public void test(TestVo testVo) {
}
首先定义一个CustomerLock注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomerLock {
String key() ;
long lockTimeOut() default 9000 ;
String errorMessage() default "请勿重复提交";
}
然后定义一个RedisLock
@Component
@Slf4j
public class RedisLock {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 加锁
* @param key
* @param value 当前时间+超时时间
* @return
*/
public boolean lock(String key, String value) {
if(redisTemplate.opsForValue().setIfAbsent(key, value)) {
return true;
}
//currentValue=A 这两个线程的value都是B 其中一个线程拿到锁
String currentValue = redisTemplate.opsForValue().get(key);
//如果锁过期
if (!StringUtils.isEmpty(currentValue)
&& Long.parseLong