防止表单重复提交(v1.7.7)

使用redis分布式锁解决表单重复提交问题。

  1. 核心思想:
  2. try {
  3. 锁(用户id + 接口名) {
  4. 执行业务代码
  5. }
  6. } finally {
  7. 释放锁
  8. }
  9. 在锁的内部执行业务代码时,其它线程进来都将拒之门外。

新增拦截器继承BaseLockInterceptor

  1. /**
  2. * 使用分布式锁防止表单重复提交
  3. *
  4. * @author tanghc
  5. */
  6. public class LockInterceptor extends BaseLockInterceptor {
  7. private StringRedisTemplate redisTemplate;
  8. public LockInterceptor() {
  9. redisTemplate = ApiContext.getApplicationContext().getBean(StringRedisTemplate.class);
  10. }
  11. @SuppressWarnings("rawtypes")
  12. @Override
  13. protected RedisTemplate getRedisTemplate() {
  14. return redisTemplate;
  15. }
  16. @Override
  17. protected String getUserId() {
  18. Map<String, Claim> jwtData = ApiContext.getJwtData();
  19. String id = jwtData.get("id").asString(); // 用户id
  20. return id;
  21. }
  22. @Override
  23. public boolean match(ApiMeta apiMeta) {
  24. return "userlock.test".equals(apiMeta.getName()); // 只针对这个接口
  25. }
  26. }

实现上面三个方法即可,match方法返回true表示执行这个拦截器,可针对特定的接口做操作。

然后配置拦截器:

  1. apiConfig.setInterceptors(new ApiInterceptor[] {new LockInterceptor()});