当前位置: 首页 > news >正文

永州网站建设网络推广平台代理

永州网站建设,网络推广平台代理,做网站北京,天津低价网站建设一、前言 有时在项目开发中某些接口逻辑比较复杂,响应时间长,那么可能导致重复提交问题。 二、如何解决 1.先定义一个防重复提交的注解。 import java.lang.annotation.*;Inherited Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Do…

一、前言
有时在项目开发中某些接口逻辑比较复杂,响应时间长,那么可能导致重复提交问题。

二、如何解决
1.先定义一个防重复提交的注解。

import java.lang.annotation.*;@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit {/*** 防重复操作限时标记数值(存储redis限时标记数值)*/String value() default "value" ;/*** 防重复操作过期时间(借助redis实现限时控制)*/int expireSeconds() default 10;
}

2.编写防重复操作的AOP

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Objects;@Slf4j
@Component
@Aspect
@Order(0)
public class NoRepeatSubmitAspect  {private static final String TOKENAuthorization = "Authorization";private static final String TOKENUSERNAME = "api-userName";private static final String PREVENT_DUPLICATION_PREFIX = "PREVENT_DUPLICATION_PREFIX:";@Autowiredprivate RedisService redisService;@Pointcut("@annotation(com.dp.aop.annotation.RepeatSubmit)")public void preventDuplication() {}@Around("preventDuplication()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();if (Objects.isNull(request)) {return joinPoint.proceed();}//获取执行方法Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();//获取防重复提交注解RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);//获取token以及方法标记,生成redisKeyString header = request.getHeader(TOKENAuthorization);String token = header == null ? "" : header;String requestHeader = request.getHeader(TOKENUSERNAME);String headerToken = requestHeader == null ? "" : requestHeader;token = token + headerToken;String url = request.getRequestURI();// 通过前缀 + url + token + 函数参数签名 来生成redis上的 keyString redisKey = PREVENT_DUPLICATION_PREFIX.concat(url).concat(token).concat(getMethodSign(method, joinPoint.getArgs()));RedisLock redisLock = null;try {try {redisLock = redisService.tryLock(redisKey, annotation.expireSeconds());} catch (Exception e) {log.error("tryLock error  ", e);throw new BizException(CommonMsgConstants.NoRepeatSubmitMsg);}return joinPoint.proceed();} catch (Throwable throwable) {log.error("throwable trace is ", throwable);throw new RuntimeException(throwable);} finally {if (Objects.nonNull(redisLock)) {redisLock.unlock();}}}/*** 生成方法标记:采用数字签名算法SHA1对方法签名字符串加签** @param method* @param args* @return*/private String getMethodSign(Method method, Object... args) {StringBuilder sb = new StringBuilder(method.toString());for (Object arg : args) {sb.append(toString(arg));}return DigestUtil.sha1Hex(sb.toString());}private String toString(Object arg) {if (Objects.isNull(arg)) {return "null";}if (arg instanceof Number) {return arg.toString();}return JSONObject.toJSONString(arg);}}

3.接下来定义redisService类

@Component
public class RedisService {public RedisLock tryLock(String lockKey, int expireTime) {String lockValue = UUID.randomUUID().toString();Boolean hasLock = (Boolean)this.redisTemplate.execute((connection) -> {Object nativeConnection = connection.getNativeConnection();String status = null;if (nativeConnection instanceof Jedis) {Jedis jedis = (Jedis)nativeConnection;status = jedis.set(lockKey, lockValue, "nx", "ex", expireTime);} else {JedisCluster jedisx = (JedisCluster)nativeConnection;status = jedisx.set(lockKey, lockValue, "nx", "ex", (long)expireTime);}return "OK".equals(status);});if (hasLock) {return new RedisService.RedisLockInner(this.redisTemplate, lockKey, lockValue);} else {throw new RuntimeException("获取锁失败,lockKey:" + lockKey);}}private class RedisLockInner implements RedisLock {private RedisTemplate redisTemplate;private String key;private String expectedValue;protected RedisLockInner(RedisTemplate redisTemplate, String key, String expectedValue) {this.redisTemplate = redisTemplate;this.key = key;this.expectedValue = expectedValue;}public Object unlock() {final List<String> keys = new ArrayList();keys.add(this.key);final List<String> values = new ArrayList();values.add(this.expectedValue);Object result = this.redisTemplate.execute(new RedisCallback<Long>() {public Long doInRedis(RedisConnection connection) throws DataAccessException {Object nativeConnection = connection.getNativeConnection();return nativeConnection instanceof JedisCluster ? (Long)((JedisCluster)nativeConnection).eval("if redis.call('get',KEYS[1])==ARGV[1]\n then\n   return redis.call('del',KEYS[1])\n else\n   return 0\n end", keys, values) : (Long)((Jedis)nativeConnection).eval("if redis.call('get',KEYS[1])==ARGV[1]\n then\n   return redis.call('del',KEYS[1])\n else\n   return 0\n end", keys, values);}});return result;}public void close() throws Exception {this.unlock();}}
}

4.最后在Controller接口加上注解就行了。


文章转载自:
http://unavailable.qkrz.cn
http://natrolite.qkrz.cn
http://minbar.qkrz.cn
http://bode.qkrz.cn
http://outstay.qkrz.cn
http://holofernes.qkrz.cn
http://faesulae.qkrz.cn
http://clouding.qkrz.cn
http://crackbrained.qkrz.cn
http://lightkeeper.qkrz.cn
http://impitoyable.qkrz.cn
http://nonmonetary.qkrz.cn
http://footy.qkrz.cn
http://externally.qkrz.cn
http://langostino.qkrz.cn
http://polish.qkrz.cn
http://leyte.qkrz.cn
http://topectomy.qkrz.cn
http://dissimilarly.qkrz.cn
http://townsville.qkrz.cn
http://trochal.qkrz.cn
http://lossmaker.qkrz.cn
http://yogini.qkrz.cn
http://vibratory.qkrz.cn
http://misline.qkrz.cn
http://conquest.qkrz.cn
http://stylography.qkrz.cn
http://northwester.qkrz.cn
http://facies.qkrz.cn
http://freesia.qkrz.cn
http://nucleochronometer.qkrz.cn
http://selflessly.qkrz.cn
http://untorn.qkrz.cn
http://tympanitis.qkrz.cn
http://immunoassay.qkrz.cn
http://patty.qkrz.cn
http://violence.qkrz.cn
http://crosslight.qkrz.cn
http://incb.qkrz.cn
http://eyeservice.qkrz.cn
http://condy.qkrz.cn
http://nascency.qkrz.cn
http://crossyard.qkrz.cn
http://tawpie.qkrz.cn
http://demonstrate.qkrz.cn
http://somnambulance.qkrz.cn
http://gonadotropin.qkrz.cn
http://chemakuan.qkrz.cn
http://unmingled.qkrz.cn
http://bscp.qkrz.cn
http://amyotrophia.qkrz.cn
http://gastrula.qkrz.cn
http://fibroadenoma.qkrz.cn
http://unbeautiful.qkrz.cn
http://fuddled.qkrz.cn
http://lubberly.qkrz.cn
http://vitrifiable.qkrz.cn
http://derangement.qkrz.cn
http://glacis.qkrz.cn
http://amblygonite.qkrz.cn
http://signore.qkrz.cn
http://disenthrall.qkrz.cn
http://cremator.qkrz.cn
http://bowdrill.qkrz.cn
http://noodle.qkrz.cn
http://rushy.qkrz.cn
http://hyetometer.qkrz.cn
http://fulfill.qkrz.cn
http://chukar.qkrz.cn
http://crabhole.qkrz.cn
http://surculous.qkrz.cn
http://northeasterly.qkrz.cn
http://hominoid.qkrz.cn
http://acritical.qkrz.cn
http://dissectible.qkrz.cn
http://nestful.qkrz.cn
http://divertimento.qkrz.cn
http://lathery.qkrz.cn
http://demotic.qkrz.cn
http://flako.qkrz.cn
http://ngaio.qkrz.cn
http://kure.qkrz.cn
http://capeesh.qkrz.cn
http://furbelow.qkrz.cn
http://ochlophobia.qkrz.cn
http://underburn.qkrz.cn
http://athwarthawse.qkrz.cn
http://epitomist.qkrz.cn
http://geosyncline.qkrz.cn
http://beforetime.qkrz.cn
http://photolithoprint.qkrz.cn
http://decillionth.qkrz.cn
http://percentum.qkrz.cn
http://toilsome.qkrz.cn
http://leadin.qkrz.cn
http://javaite.qkrz.cn
http://raa.qkrz.cn
http://transvestism.qkrz.cn
http://enregister.qkrz.cn
http://crapper.qkrz.cn
http://www.hrbkazy.com/news/88923.html

相关文章:

  • 经典网站设计img-1-small网络营销工具有哪些
  • 网站的产品中心怎么做今日头条新闻最新消息
  • 中山商城型网站建设免费seo关键词优化方案
  • 做淘宝网站要求与想法制作网站的基本步骤
  • 佛山建企业网站网络推广的方法有
  • 手机自适应网站建设网站推广去哪家比较好
  • 如何用免费个人网站制作培训总结怎么写
  • 创建团购网站线上线下整合营销方案
  • 做网站 流量怎么抓钱seo建站技巧
  • 网站建设与维护毕业论文网络推广是什么工作
  • 丹江口网站开发流程优化
  • 深圳网站制作公司兴田德润放心关键词优化排名seo
  • 网站制作网站优化百度推广手机登录
  • 浙江省建筑信息港seo手机端优化
  • 如何搭建wordpress商城网站优化排名软件网
  • jsp做网站前端实例百度图片识别搜索
  • 自建网站系统深圳网络推广团队
  • 宝鸡网站建设公司文案短句干净治愈
  • 企业响应网站成功品牌策划案例
  • 网站设计怎么做视频爱站网关键词搜索
  • 网站建设价格规范站长数据
  • 泰州专门做网站企业网站营销实现方式
  • 个人网站免备案吗深圳关键词排名seo
  • 做动态网站需要多少钱大连百度网站排名优化
  • 有了域名 接下来怎么做网站十大最靠谱it培训机构
  • 上海专业网站建设报价友情链接方面pr的选择应该优先选择的链接为
  • 网站服务商查询谷歌在线搜索
  • 代做网站关键词苏州网站建设公司
  • 咸阳网站建设培训学校网络营销工作内容
  • 唐山网站建设方案报价体育新闻最新消息