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

郑州专业做网站多少钱班级优化大师是干什么用的

郑州专业做网站多少钱,班级优化大师是干什么用的,nginx php7 wordpress,深圳微信推广平台一、前言 有时在项目开发中某些接口逻辑比较复杂#xff0c;响应时间长#xff0c;那么可能导致重复提交问题。 二、如何解决 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 ListString keys new ArrayList();keys.add(this.key);final ListString values new ArrayList();values.add(this.expectedValue);Object result this.redisTemplate.execute(new RedisCallbackLong() {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://www.hkea.cn/news/14583443/

相关文章:

  • 网站建设不完整什么意思石家庄是几线城市
  • 网站搜索显示图片微信商城怎么找
  • 外链网站 英文东乡族网站建设
  • 中国互联网头部企业北京百度搜索排名优化
  • 基于C 的网站开发源码靖江网站定制
  • 昆山网站建设书生商友官方网站开发与定制
  • 东莞建站网站怎么查询网站的域名
  • 如何免费申请公司网站wordpress手册插件
  • 厦门满山红网站建设Wordpress好看模板
  • 网站收费系统平台wordpress 前台文章
  • 岳阳市网站建设推广如何做好电商
  • 微信小程序开发网站建设绵阳东原建设工程有限公司网站
  • lol网站模板开通网站费用怎么做分录
  • 在线制作网站乔拓云dede如何制作手机网站
  • 网站新闻中心模版东平网站建设
  • 网站建设第三方验收收费标准电子宣传册如何制作
  • 手机微网站模板中国软件外包公司排行
  • 临沧永德网站建设电子商务公司管理咨询服务合同范本
  • 广州seo网站推广公司做网站能够带来的好处
  • 杭州网站建设方案优化网站后台上传新闻
  • 晋江网站有什么职业做学习网站开发教程
  • 做路牌的网站做网站赚几百万
  • 泉州专业做网站app网站
  • 苏州 网站设计it外包服务平台
  • 无锡外贸网站建设wordpress分类目录样式
  • 广州智能建站软件关于化妆品网站成功案例
  • 河南省建设厅网站资质平移办法网页后台常用设计尺寸
  • 做网站所需要的代码6网站建设dream
  • 什么是网站主机ip域名查询网
  • 查询网站备案信息优化设计答案